1.limit 分頁優(yōu)化
如果數(shù)據(jù)量很大頁數(shù)較多融蹂,limit 偏移量越大 就會(huì)查詢的速度越慢帮寻。
原因是 偏移量越大掃描的行數(shù)越多 乍狐,比如 limit 100000 , 10 ,意思是掃描符合條件的 1000010 只要后 10條記錄,這樣偏移量越大掃描行數(shù)越多固逗,就越慢浅蚪。
改為關(guān)聯(lián)子查詢會(huì)較快些,把多表篩選 limit 改為 單表烫罩。與之前相比 會(huì)快些惜傲。
如下sql.
原sql: SELECT auc.CITY_ID,auc.CITY_NAME,fa.CREATE_TIME
FROM BOSS_FINANCE_APPLY fa
INNER JOIN BOSS_FINANCE_AUCTION auc ON fa.AUCTION_ID=auc.AUCTION_ID
WHERE fa.APPLY_BACK_STATUS=0 AND fa.CITY_ID =2
ORDER BY APPLY_STATUS,ID DESC LIMIT 800,20;
優(yōu)化后sql: SELECT auc.CITY_ID,auc.CITY_NAME,fa.CREATE_TIME
FROM BOSS_FINANCE_APPLY fa
INNER JOIN BOSS_FINANCE_AUCTION auc ON fa.AUCTION_ID=auc.AUCTION_ID
INNER JOIN (SELECT ID FROM BOSS_FINANCE_APPLY WHERE APPLY_BACK_STATUS=0 and CITY_ID =2 ORDER BY APPLY_STATUS,ID DESC LIMIT 800,20) TFA //新增子查詢優(yōu)化
WHERE fa.ID=TFA.ID ;
優(yōu)化后 查詢時(shí)間會(huì)縮短原來的 幾十倍到幾百倍不等。
2嗡髓,查詢數(shù)據(jù)時(shí)候 發(fā)現(xiàn)加上了 limit 1 扶踊,sql不會(huì)使用之前優(yōu)化后的索引赃份,處理方法是澄耍,在sql語句中指定 使用某個(gè)索引样漆。
網(wǎng)上說 加limit不是導(dǎo)致 mysql使用不同索引的原因,這還是和mysql的 語法解析器有關(guān)长捧,還有與mysql的版本有關(guān)系嚣鄙。
強(qiáng)制索引是一種簡單的解決這類問題的辦法。
如下sql:
SELECT
a.ID,
a.AUCTION_ID
FROM
BOSS_FINANCE_APPLY a FORCE INDEX(IDX_STATUS_TYPE) //指定使用某個(gè)索引
INNER JOIN BOSS_FINANCE_AUCTION b ON a.AUCTION_ID = b.AUCTION_ID
AND a.APPLY_BACK_STATUS = 0
AND a.ALLOCATION_TYPE = 0
AND a.APPLY_STATUS < 2
WHERE
NOT EXISTS ( SELECT ( 1 ) FROM BOSS_FINANCE_CHANNEL_NO_TASK c WHERE c.CHANNEL_ID = b.SOURCE_ID OR c.CHANNEL_ID = b.CHANNEL_ID )
ORDER BY
a.ID limit 1;
IDX_STATUS_TYPE 索引是:APPLY_STATUS和ALLOCATION_TYPE 的組合索引串结。