GG資源網

WordPress網站優化之MySQL優化

建立了一個博客,發表了3.8萬篇文章。

隨著數據條數的增多,尤其是搜索的時候,發現搜索時靈時不靈,很久都沒有反應。

後面在wordpress中footer.php頁面下加入這一句,可以顯示mysql載入的速度和耗時。

<?php echo get_num_queries();?>次載入共計耗時<?php timer_stop(1);?>秒
搜索關鍵詞之後,發現用時居然快一分鐘了,實在是不能忍了。

18次載入共計耗時52.783秒
————————————————

限定搜索標題
搜索發現關鍵詞發現返回一兩萬條結果。

才了解到搜索不僅僅是搜索標題,還包括正文內容。

其實我在這裡並不需要搜索正文內容,修改PHP代碼,限定只搜索標題,將下面的代碼添加到主題的 functions.php 文件即可

/**
* 讓 WordPress 只搜索文章的標題
* https://www.wpdaxue.com/search-by-title-only.html
*/
function __search_by_title_only( $search, &$wp_query )
{
global $wpdb;

if ( empty( $search ) )
return $search; // skip processing - no search term in query

$q = $wp_query->query_vars;
$n = ! empty( $q['exact'] ) ? '' : '%';

$search =
$searchand = '';

foreach ( (array) $q['search_terms'] as $term ) {
$term = esc_sql( like_escape( $term ) );
$search .= "{$searchand}($wpdb->posts.post_title LIKE '{$n}{$term}{$n}')";
$searchand = ' AND ';
}

if ( ! empty( $search ) ) {
$search = " AND ({$search}) ";
if ( ! is_user_logged_in() )
$search .= " AND ($wpdb->posts.post_password = '') ";
}

return $search;
}
add_filter( 'posts_search', '__search_by_title_only', 500, 2 );
對MySQL的wp_posts表中post_title增加索引
這樣加快對標題搜索。

安裝Memcached插件
在bt面板里勾選這個插件,通過緩存資料庫查詢結果,減少資料庫訪問次數,以提高動態Web應用的速度、提高可擴展性。

清理WordPress中MySQL資料庫垃圾數據
資料庫的垃圾數據主要存在wp_posts、 wp_postmeta、 wp_commetns、 wp_commentmeta 和 wp_options

具體可以搜索」介紹使用WordPress時10個常用的MySQL查詢「等內容。

關於Wordpress中數據表關係如下

數據表 存儲的數據 關聯到
wp_posts 文章、頁面、附件、版本、導航菜單項目 wp_postmeta (通過post_id關聯)
wp_postmeta 每個文章的元數據 wp_posts (通過 post_id關聯)
wp_term_relationships 文章和自定義分類法之間的關係 wp_posts (通過 post_id 關聯) wp_term_taxonomy (通過term_taxonomy_id 關聯)
wp_term_taxonomy 自定義分類法(包括默認的分類目錄和標籤) wp_term_relationships(通過 term_taxonomy_id關聯)
wp_terms 關聯到分類法中的分類目錄,標籤和自定義分類項目 wp_term_taxonomy (通過term_id 關聯)
wp_posts
因為wp_posts會保留文章修訂版本,即發布一篇文章,在資料庫里是有兩條的數據的。

刪除文章修訂版本

DELETE FROM wp_posts WHERE post_type = 'revision';
wp 媒體管理器上傳圖片的時候同時會生成attachment 文章格式,如果你不需要根據這個檢索圖片的話也可以刪掉。

DELETE FROM wp_posts WHERE post_type = 'attachment';
wp_postmeta
這裡是重災區,可以執行以下命令

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 = '_revision-control';
DELETE FROM wp_postmeta WHERE post_id NOT IN (SELECT post_id FROM wp_posts);
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}}';
如果你不需要管理你的多媒體文件可以使用下面這兩句

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 in ('_edit_lock', '_edit_last', '_wp_old_slug', '_revision-control', '{{unknown}}', '_wp_attached_file', '_wp_attachment_metadata');
DELETE FROM wp_postmeta WHERE post_id NOT IN (SELECT id FROM wp_posts);
wp_comments
刪除所有垃圾評論

DELETE FROM wp_comments WHERE comment_type = 'trash';
刪除所有待審評論

DELETE FROM wp_comments WHERE comment_approved = '0';
wp_commentmeta
一般來說直接刪掉這個表就可以了,如果你使用了commentmeta存儲信息請謹慎執行此句

TRUNCATE TABLE wp_commentmeta;
wp_options
尤其是使用網易雲音樂,都會在wp_options表中產生大量垃圾數據。

DELETE FROM wp_options WHERE option_name LIKE '_transient_%';
DELETE FROM wp_options WHERE option_name LIKE '_transient_timeout_%';
這樣會刪除所有臨時數據,包括未過期的,謹慎使用。

經過上面多種方法,終於把速度提升到1秒以內。鼓掌撒花。
————————————————

原文鏈接:https://blog.csdn.net/linyl07/article/details/123748240

由於網站搬家,部分鏈接失效,如無法下載,請聯繫站長!謝謝支持!
1. 帶 [親測] 說明源碼已經被站長親測過!
2. 下載後的源碼請在24小時內刪除,僅供學慣用途!
3. 分享目的僅供大家學習和交流,請不要用於商業用途!
4. 本站資源售價只是贊助,收取費用僅維持本站的日常運營所需!
5. 本站所有資源來源於站長上傳和網路,如有侵權請郵件聯繫站長!
6. 沒帶 [親測] 代表站長時間緊促,站長會保持每天更新 [親測] 源碼 !
7. 盜版ripro用戶購買ripro美化無擔保,若設置不成功/不生效我們不支持退款!
8. 本站提供的源碼、模板、插件等等其他資源,都不包含技術服務請大家諒解!
9. 如果你也有好源碼或者教程,可以到審核區發布,分享有金幣獎勵和額外收入!
10.如果您購買了某個產品,而我們還沒來得及更新,請聯繫站長或留言催更,謝謝理解 !
GG資源網 » WordPress網站優化之MySQL優化

發表回復

CAPTCHAis initialing...