mysql中如何批量删除冗余数据库_WordPress清理数据库中的冗余数据加速网站运行速度...
WordPress的文章、評論等很多數據都是存放在數據庫的,每當在WordPress編輯文章的時候會生成一些文章修訂版本信息、自動保存文章草稿等無用數據,還有更換主題,刪除插件也會將數據留在數據庫中,在卸載后無法被清理。會造成WordPress數據庫中增加很多冗余的數據信息,占用比較大的數據庫緩存。而隨著WordPress網站使用的時間越久,網站數據庫中堆積的冗余數據信息越來越多,數據查詢越來越慢,從而導致WordPress有大量無用的垃圾數據使數據庫負擔沉重,數據庫運行起來越來越慢,并且也會造成網站訪問速度緩慢,網頁打開的速度變慢,喪失用戶的良好體驗度。所以,需要定期清理和優化WordPress數據庫中的冗余數據,從而保證WordPress數據庫運行的效率和網站的訪問速度。
WordPress數據庫表說明
wp_commentmeta
用于保存評論的元信息,在將評論放入回收站等操作時會將數據放入此表,Akismet等垃圾評論標識插件也會生成數據到此表。此表不太重要
wp_comments
用于保存評論信息的表
wp_links
用于保存用戶輸入到Wordpress中的鏈接(通過Link Manager)的表
wp_options
用于保存Wordpress相關設置、參數的表,里面包括了大量的重要信息(主題和插件的各種參數、設置)
wp_postmeta
用于保存文章的元信息(meta)的表
wp_posts
用于保存你所有的文章相關信息的表,非常的重要。一般它存儲的數據是最多的
wp_terms
文章和鏈接分類以及文章的tag分類可以在表里找到
wp_term_relationships
日志與wp_terms中的類別與標簽聯合起來共同存儲于此表中。類別相關鏈接也存儲在此表中
wp_term_taxonomy
該表對wp_terms表中的條目分類(類別、鏈接以及標簽)進行說明
wp_usermeta
用于保存用戶元信息(meta)的表,head的一些豐富元素信息會在此表記錄
wp_users
用于保存Wordpress使用者的相關信息的表
提示:清理優化之前請先備份數據庫,以防因失誤帶來的意外情況!只有做好備份工作才可以有備無患。
PS:主要涉及到的幾張表:wp_options,wp_posts,wp_postmeta,wp_commentmeta
定期清理 wp_options 數據表
wp_options 這個數據表是wordpress設置的全局數據,主要存儲的數據是和WordPress后臺的設置對應(如博客名、博客地址、基本設置…等),平常在WordPress控制面板–設置 里進行的設置,都會對應的存儲在這里。wp_options表里垃圾殘留記錄會隨著時間慢慢積累直至臃腫龐大致使你的數據庫執行效率低下拖慢你整個主機的運行。
造成 wp_options 表數據膨脹的主要原因是:
(1)在使用的過程中會經常安裝、停用或者更換插件,或更換使用不同的主題,并且在使用插件和主題的過程中會在數據庫 wp_options 表內增加大量的數據,包括一些冗余的垃圾數據(插件、主題在刪除之后沒有進行清理,造成殘留的無用數據)
(2)占用數據的大戶–RSS緩存,后臺的數據調用竟然會放到數據庫里面。在wp_options表中發現了大量option_name包含“_transient”的數據,那就是WordPress程序中引入RSSFeed后產生的緩存。正常的WordPress使用過程中,會不斷產生這些數據,久而久之,就非常之龐大了
清理 wp_options 表的處理方法
(1)禁用RSS緩存:打開根目錄 wp-config.php 配置文件里面設置。將下面代碼添加上去。
// 不去調用RSS緩存。 0 則不緩存 magpie RSS(改為1則緩存)
define('MAGPIE_CACHE_ON', '0');
(2)手動清理:進入phpmyadmin或者mysql命令行模式選擇對應的數據庫,執行下面mysql語句即可:
wp_options 表里的內容,特別是 _transient 、_site開始的都可以刪除,這些是控制板訂閱緩存(后臺首頁顯示的訂閱緩存,居然保存在wp_options表中,數量多體積大)
-- wordpress數據庫手動清除Transients(下面兩個SQL語句,任選一條執行)
DELETE FROM wp_options WHERE option_name LIKE ('%\_transient\_%');
DELETE FROM wp_options WHERE option_name REGEXP '_transient_';
PS:可以使用插件clean options清理 wp_options 表中的垃圾數據。
清理 wp_posts 表(包括刪除修訂版本、自動草稿的文章數據)
wordpress的文章有好多:wp_posts表中包括文章種類:文章、修訂版本、頁面、文章的附件、菜單;其中每種文章又會有很多狀態:繼承、發布、私有、草稿、自動草稿、回收站。
wp_posts的重要字段含義
post_type(文章類型):post 表示為文章,revision 表示為修訂版本,page 為頁面,attachment 是文章的附件信息,nav_menu_item 是菜單。這里我們需要的是文章、頁面、和菜單,除此之外的都可以刪除。
post_status(文章狀態):inherit 是繼承的附件和文章的附帶信息,publish 是已經發布、private 是私有的,draft 是草稿,auto-draft 是自動草稿,trash 是在回收站。這里我們需要的是publish的狀態的(已經發布的文章、頁面和菜單),除此之外的都可以刪除。
PS:當然可以根據自己的需求選擇刪除哪些
造成 wp_posts 表中數據冗余原因:
(1)在博主寫文章的時候,系統會保存很多的中間狀態(如修訂版本、自動保存等),在文章發布之后其很多的中間狀態沒有被刪除。
(2)點擊“寫文章”或“新建頁面”時產生的,每點擊一次就生成一條“自動草稿(auto draft)”的冗余數據。
清理 wp_posts 表的解決辦法
進入phpmyadmin或者mysql命令行模式選擇對應的數據庫,執行下面mysql語句即可:
-- 刪除所有非發布狀態帖子信息(只保留已經發布的狀態的文章、菜單、頁面)
DELETE FROM wp_posts WHERE NOT(post_status = 'publish' AND post_type IN('post','nav_menu_item','page'));
-- 刪除全部文章修訂版本及所對應的關聯數據
DELETE a,b,c FROM wp_posts a
LEFT JOIN wp_term_relationships b ON (a.ID = b.object_id) LEFT JOIN wp_postmeta c ON (a.ID = c.post_id) WHERE a.post_type = 'revision';
-- 刪除自動保存草稿以及修訂版本的文章
delete from wp_posts where (post_status='auto-draft' or post_status='inherit') and post_type='post';
清理 wp_postmeta 表
wp_postmeta表是用來儲存文章的元信息,多半是系統或者插件自動生成的,當然在主題使用了自定義字段是數據也是儲存在這個表里的。
造成 wp_postmeta 表中數據冗余原因:
(1)文章被刪除之后,其在wp_postmeta中的數據理應被刪除,在系統中多數情況是系統自動刪除,但是由于人為刪除文章,系統不知道被刪除,就不會刪除wp_postmeta表中的數據,造成冗余。
(2)很多主題、插件沒有做好及時清除的工作。
清理 wp_postmeta 表的解決辦法
執行下列相關的MySQL指令則可以清理出無用的數據
--規矩刪除(刪除文章中不存在文章的元信息)
DELETE FROM wp_postmeta WHERE post_id NOT IN (SELECT post_id FROM wp_posts);
-- 安全刪除(刪除_edit_lock和_edit_last條目是安全的)
DELETE FROM wp_postmeta WHERE meta_key = '_edit_lock';
DELETE FROM wp_postmeta WHERE meta_key = '_edit_last';
-- 風險刪除(除了這兩條還執行了一些其他語句由于有些風險:自己酌情考慮)
DELETE FROM wp_postmeta WHERE meta_key = '_wp_old_slug';
DELETE FROM wp_postmeta WHERE meta_key = '_revision-control';
DELETE FROM wp_postmeta WHERE meta_value = '{{unknown}}';
--特殊插件刪除(postnav插件會記錄每個文章的訪問數,如果不需要,可以刪除)
DELETE FROM wp_postmeta WHERE meta_key = 'views';
-- 刪除孤立的文章元信息(當文章的記錄刪除后,還有日志擴展表postmeta的數據還沒有刪除,也要人工清理下)
DELETE pm FROM wp_postmeta pm LEFT JOIN wp_posts wp ON wp.ID = pm.post_id WHERE wp.ID IS NULL
-- 刪除重復的 meta key 和 value 記錄,僅保留最新的一個
DELETE FROM wp_postmeta WHERE meta_id IN (
select * from (select meta_id FROM wp_postmeta pm WHERE
meta_id NOT IN (SELECT max(meta_id) FROM wp_postmeta pm2 where pm2.post_id=pm.post_id and pm2.meta_key=pm.meta_key)
) as g1
)
在WordPress的后臺上傳圖片或者附件后會在wp_postmeta中生成_wp_attached_file和_wp_attachment_metadata兩個項,wp_posts也會記錄附件的信息。如果使用FTP工具上傳文件,表中就不會有這些信息。
-- 特殊操作刪除
DELETE FROM wp_postmeta WHERE meta_key = '_wp_attached_file';
DELETE FROM wp_postmeta WHERE meta_key = '_wp_attachment_metadata';
以下的這些可以考慮清,或者不清,其實很多人或許沒這個項目,因為這些大都由插件產生的。
-- 可選項目
DELETE FROM wp_postmeta WHERE meta_key = '_wp_old_slug';
DELETE FROM wp_postmeta WHERE meta_key = 'jd_tweet_this';
DELETE FROM wp_postmeta WHERE meta_key = 'wp_jd_clig';
DELETE FROM wp_postmeta WHERE meta_key = 'wp_jd_target';
DELETE FROM wp_postmeta WHERE meta_key = 'nofollow4post';
DELETE FROM wp_postmeta WHERE meta_key = 'ratings_score';
DELETE FROM wp_postmeta WHERE meta_key = 'ratings_users';
DELETE FROM wp_postmeta WHERE meta_key = 'ratings_average';
DELETE FROM wp_postmeta WHERE meta_key = 'wp_noextrenallinks_mask_links';
DELETE FROM wp_postmeta WHERE meta_key = '_wp_page_template';
DELETE FROM wp_postmeta WHERE meta_key = '_sexybookmarks_permaHash';
DELETE FROM wp_postmeta WHERE meta_key = '_sexybookmarks_shortUrl';
以上幾條語句執行完畢能夠刪除掉95%以上的數據,算的上是極限優化了,最后考慮到這個數據表并不是很重要,有潔凈癖的人可以嘗試清空這個表,當然測試清空表會讓一些原本的數據丟失。
-- 潔癖刪除
TRUNCATE TABLE wp_postmeta;
清理 wp_commentmeta 表
wp_commentmeta 表是WP官方推薦的 Akismet 反垃圾評論防護插件保存的垃圾信息記錄(記錄管理員用戶對垃圾評論的處理結果以及插件自動判斷某條評論是否為垃圾評論的相關記錄),這個表如果長時間不清理的話,你會發現 wp_commentmeta 數據表會變得越來越大,甚至比我們文章數據庫還要大。而且垃圾評論很少見的,建議還是不要用到像Akismet這類插件,或者我們用這個插件之后要定期清空數據(直接清理刪除 wp_commentmeta 數據表內容就可以,不要刪除這個字段。)。
造成 wp_commentmeta 表中數據冗余原因:
(1)評論被刪除之后,其在wp_commentmeta中的數據理應被刪除,在系統中多數情況是系統自動刪除,但是由于人為刪除文章,系統不知道被刪除,就不會刪除wp_commentmeta表中的數據,造成冗余。
(2)很多主題、插件沒有做好及時清除的工作。
清理 wp_commentmeta 表的解決辦法
進入phpmyadmin或者mysql命令行模式選擇對應的數據庫,執行下面mysql語句即可:
--刪除孤立的評論元信息(評論刪除后殘留在wp_commentmeta表中的信息)
DELETE FROM wp_commentmeta WHERE comment_id NOT IN (SELECT comment_id FROM wp_comments);
DELETE FROM wp_commentmeta WHERE meta_key REGEXP 'akismet';
-- 刪除記錄評論被刪除的時間,這些信息用處不是很大
DELETE FROM wp_commentmeta WHERE meta_key LIKE '%trash%';
-- 直接全部刪除wp_commentmeta數據表內容,影響不會太大,這里面不會涉及重要的數據
TRUNCATE TABLE wp_commentmeta;
清理其他數據表
-- 刪除所有垃圾留言(包括待審、垃圾評論、回收站評論)
DELETE FROM wp_comments WHERE comment_approved != '1';
-- 刪除待審評論
DELETE FROM wp_comments WHERE comment_approved = '0';
-- 刪除垃圾評論
DELETE FROM wp_comments WHERE comment_approved = 'spam';
-- 刪除回收站評論
DELETE FROM wp_comments WHERE comment_approved = 'trash';
--孤立的關系信息(文章、評論等刪除后殘留在wp_term_relationships表中的信息)
DELETE FROM wp_term_relationships WHERE term_taxonomy_id=1 AND object_id NOT IN (SELECT id FROM wp_posts);
-- 刪除沒有的標簽(有些文章刪除了,但標簽還在,WordPress不會自動刪除的)
DELETE a,b,c FROM wp_terms AS a
LEFT JOIN wp_term_taxonomy AS c ON a.term_id = c.term_id
LEFT JOIN wp_term_relationships AS b ON b.term_taxonomy_id = c.term_taxonomy_id
WHERE (
c.taxonomy = 'post_tag' AND
c.count = 0
);
優化數據庫表
原理:數據庫優化不涉及數據的刪除,是將數據庫的表的狀態調整好。在使用phpmyadmin時候,或許您會看到數據庫表后面有多余 xxMB 的字樣,這個指的是那些已經分配給當前表但是卻沒有使用的空間。這個多余是沒有什么害處的,他不會占用你的空間。當刪除一個表的一部分記錄時,這些記錄仍然保持在一個linked list 中,當插入新數據時會再次使用這些老紀錄的位置。所以刪除紀錄會閑置一些空間造成你說的“多余”。
優化:在phpmyadmin手動 優化或者修復表即可,選擇數據庫后執行下面SQL語句:
OPTIMIZE TABLE wp_commentmeta;
OPTIMIZE TABLE wp_comments;
OPTIMIZE TABLE wp_links;
OPTIMIZE TABLE wp_options;
OPTIMIZE TABLE wp_postmeta;
OPTIMIZE TABLE wp_posts;
OPTIMIZE TABLE wp_terms;
OPTIMIZE TABLE wp_term_relationships;
OPTIMIZE TABLE wp_term_taxonomy;
OPTIMIZE TABLE wp_usermeta;
OPTIMIZE TABLE wp_users;
PS:wp_ 是默認的前綴,如果自定義更改過,請根據實際修改即可。
匯總以上數據庫的執行語句到PHP文件中一鍵優化清理WordPress數據庫
將上面所有清理數據庫的語句匯總到一個php文件(SEOClear.php),打開PHP文件后就可以直接優化清理數據了,并且保證是安全的。 粘貼以下代碼執行PHP文件即可:
//wordpress數據庫優化清理腳本
$hostname_blog = "localhost";//設定數據庫主機,同wp-config.php
$database_blog = "wordpress";//設定數據庫名,同wp-config.php
$username_blog = "root";//設定數據庫用戶名,同wp-config.php
$password_blog = "";//設定數據庫密碼,同wp-config.php
$blog = mysql_pconnect($hostname_blog, $username_blog, $password_blog) or trigger_error(mysql_error(),E_USER_ERROR);
mysql_select_db($database_blog, $blog);
mysql_query('DELETE a,b,c FROM wp_posts a LEFT JOIN wp_term_relationships b ON (a.ID = b.object_id) LEFT JOIN wp_postmeta c ON (a.ID = c.post_id) WHERE a.post_type = "revision"');
mysql_query('DELETE FROM wp_posts WHERE NOT(post_status = "publish" AND post_type IN("post","nav_menu_item","page")');
mysql_query('DELETE FROM wp_postmeta WHERE meta_key = "_edit_lock"');
mysql_query('DELETE FROM wp_postmeta WHERE meta_key = "_edit_last"');
mysql_query('DELETE FROM wp_commentmeta WHERE meta_key LIKE "%trash%"');
mysql_query('DELETE FROM wp_comments WHERE comment_approved != "1"');
mysql_query('DELETE pm FROM wp_postmeta pm LEFT JOIN wp_posts wp ON wp.ID = pm.post_id WHERE wp.ID IS NULL');
mysql_query('DELETE FROM wp_commentmeta WHERE comment_id NOT IN (SELECT comment_id FROM wp_comments)');
mysql_query('DELETE FROM wp_term_relationships WHERE term_taxonomy_id=1 AND object_id NOT IN (SELECT id FROM wp_posts)');
mysql_query('DELETE FROM wp_options WHERE option_name REGEXP "_transient_"');
mysql_query('DELETE FROM wp_postmeta WHERE meta_key = ‘_wp_attached_file’');
mysql_query('DELETE FROM wp_postmeta WHERE meta_key = ‘_wp_attachment_metadata’');
mysql_query("delete from wp_posts where (post_status='auto-draft' or post_status='inherit') and post_type='post'");
$tablelist = mysql_query("SHOW TABLES");
while($checklist = mysql_fetch_array($tablelist)) {
$optimization=mysql_query("OPTIMIZE TABLE `$checklist[0]`");
}echo 'Done';
//ps記得修改數據庫前綴~
//使用時將腳本上傳至網站任意目錄后并且通過瀏覽器訪問即可一鍵清理wordprsss數據庫。
?>
執行后將會批量刪除WordPress產生的冗余文件,修改好相應數據庫信息后上傳至網站然后使用瀏覽器直接訪問該腳本文件(SEOClear.php)即可優化清理數據庫,不過由于一次性執行多個sql查詢,所以該腳本訪問時響應速度可能會比較長,優化成功后會顯示Done。
屏蔽垃圾評論提交到數據庫,這樣數據庫就優化的差不多了
在當前WordPress主題的functions.php文件中加上以下代碼即可
//禁止垃圾評論提交到數據庫
function wp_fuckspam($comment) {
if( is_user_logged_in()){ return $comment;} //登錄用戶無壓力...
if( wp_blacklist_check($comment['comment_author'],$comment['comment_author_email'],$comment['comment_author_url'], $comment['comment_content'], $comment['comment_author_IP'], $comment['comment_agent'] )){
header("Content-type: text/html; charset=utf-8");
wp_die('
您評論包含辱罵,過激或者違反法律等言論,或者您的IP已被加入黑名單,如有疑問請聯系管理員處理!返回文章頁
');
} else {
return $comment;
}
}
add_filter('preprocess_comment', 'wp_fuckspam');
總結
以上是生活随笔為你收集整理的mysql中如何批量删除冗余数据库_WordPress清理数据库中的冗余数据加速网站运行速度...的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 斐讯k2p 月光银 硬件版本A2-软件版
- 下一篇: DHT 爬虫的学习记录
