使用動(dòng)態(tài)數(shù)據(jù)庫驅(qū)動(dòng)的網(wǎng)站,例如WordPress,你的網(wǎng)站可能依然有一個(gè)問題亟待解決:數(shù)據(jù)庫查詢拖慢了網(wǎng)站訪問速度。
使用動(dòng)態(tài)數(shù)據(jù)庫驅(qū)動(dòng)的網(wǎng)站,例如WordPress,你的網(wǎng)站可能依然有一個(gè)問題亟待解決:數(shù)據(jù)庫查詢拖慢了網(wǎng)站訪問速度。我將介紹如何識(shí)別導(dǎo)致性能出現(xiàn)問題的查詢,如何找出它們的問題所在,以及快速修復(fù)這些問題和其他加快查詢速度的方法。我會(huì)把門戶網(wǎng)站 deliciousbrains.com 出現(xiàn)的 拖慢查詢速度的情況作為實(shí)際的案例。
定位
處理慢SQL查詢的第一步是找到慢查詢。Ashley已經(jīng)在之前的 博客 里面贊揚(yáng)了調(diào)試插件 Query Monitor ,而且這個(gè)插件的數(shù)據(jù)庫查詢特性使其成為定位慢SQL查詢的寶貴工具。該插件會(huì)報(bào)告所有頁面請(qǐng)求過程中的數(shù)據(jù)庫請(qǐng)求,并且可以通過調(diào)用這些查詢代碼或者原件(插件,主題,WordPress核)過濾這些查詢,高亮重復(fù)查詢和慢查詢。
要是不愿意在生產(chǎn)安環(huán)境裝調(diào)試插件,也可以打開 MySQL Slow Query Log,這樣在特定時(shí)間執(zhí)行的所有查詢都會(huì)被記錄下來。這種方法配置和設(shè)置存放查詢位置相對(duì)簡(jiǎn)單。由于這是一個(gè)服務(wù)級(jí)別的調(diào)整,性能影響會(huì)小于使用調(diào)試插件,但當(dāng)不用的時(shí)候也應(yīng)該關(guān)閉。
理解
一旦你找到了一個(gè)你要花很大代價(jià)找到的查詢,那么接下來就是嘗試去理解它并找到是什么讓查詢變慢。最近,在我們開發(fā)我們網(wǎng)站的時(shí)候,我們找到了一個(gè)要執(zhí)行8秒的查詢。
我們使用WooCommerce和定制版的WooCommerce軟件插件來運(yùn)行我們的插件商店。此查詢的目的是獲取那些我們知道客戶號(hào)的客戶的所有訂閱。 WooCommerce是一個(gè)稍微復(fù)雜的數(shù)據(jù)模型, 即使訂單以自定義的類型存儲(chǔ),用戶的ID(商店為每一個(gè)用戶創(chuàng)建的WordPress)也沒有存儲(chǔ)在 post_author, 而是作為后期數(shù)據(jù)的一部分。訂閱軟件插件給自義定表創(chuàng)建了一對(duì)鏈接。讓我們深入了解查詢的更多信息。
MySQL是你的朋友
MySQL有一個(gè)很方便的語句 DESCRIBE ,它可以輸出表結(jié)構(gòu)的信息,比如字段名,數(shù)據(jù)類型等等。
你可能已經(jīng)知道了這個(gè)語句。但是你知道 DESCRIBE語句可以放在SELECT, INSERT, UPDATE, REPLACE 和 DELETE語句前邊使用嗎 ?更為人們所熟知的是他的同義詞 EXPLAIN ,并將提供有關(guān)該語句如何執(zhí)行的詳細(xì)信息。