WordPress在查詢post列表時,默認會同時把文章數(shù)量也查詢出來,
使用這種方式的有:get_posts?、query_posts和WP_Query。
get_posts在4.6.1+已經(jīng)不用SQL_CALC_FOUND_ROWS,但是query_posts和WP_Query還是會用,所以還須優(yōu)化。
具體語句如下:
這在網(wǎng)站數(shù)據(jù)量小的時候,不會引起什么問題,
但是當post數(shù)量到10w+的時候,這個就是一條必現(xiàn)的慢查詢,
首頁、分類、標簽、搜索頁面,只要用到這幾個函數(shù),就都會使用SQL_CALC_FOUND_ROWS這個方式。
?
如何解決?
?
方法一:
徹底禁用SQL_CALC_FOUND_ROWS
放在functions.php文件即可:
?
?
方法二:
如果仍然需要查詢文章數(shù)量,使用更加高效的EXPLAIN方式代替SQL_CALC_FOUND_ROWS
禁用掉SQL_CALC_FOUND_ROWS用法,用一種更加高效的方式,
這里我們用EXPLAIN方式
具體代碼如下,放在functions.php文件即可:
?
?
為什么用EXPLAIN而不是count(*)?
select count(*)是MySQL中用于統(tǒng)計記錄行數(shù)最常用的方法。
count方法可以返回表內精確的行數(shù),每執(zhí)行一次都會進行一次全表掃描,
以避免由于其他連接進行delete和insert引起結果不精確。
在某些索引下是好事,但是如果表中有主鍵,count(*)的速度就會很慢,特別在千萬記錄以上的大表。
如果用 explain 命令速度會快很多,因為 explain 用并不真正執(zhí)行查詢,而是查詢優(yōu)化器【估算】的行數(shù)。
在一個1500萬條記錄的表中測試,用select count(*)耗時15s,而用explain耗時0.08秒,
兩者相差差不多有200倍之多(第一次執(zhí)行會稍慢,3秒左右)。
如下是explain方式:
注意,這里用的是select *,不是select count(*)。
select *會返回一行數(shù)據(jù),包括估算行數(shù)rows,在PHP中我們fetch(),再通過$result[‘rows’]就可以拿到這個預估值。
select count(*)則會在extra中有一行Select tables optimized away,不會拿到函數(shù)估算值。
?
所以,在對數(shù)據(jù)準確性要求不高,但是對速度要求很苛刻的場合,絕對有必要用這個估算值代替。
你也可以用下面這句,結果和explain一模一樣:
根據(jù)實際情況任選一個,都是同一個東西。