1.limit 分頁(yè)優(yōu)化
如果數(shù)據(jù)量很大頁(yè)數(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ì)縮短原來(lái)的 幾十倍到幾百倍不等。
2,查詢數(shù)據(jù)時(shí)候 發(fā)現(xiàn)加上了 limit 1 ,sql不會(huì)使用之前優(yōu)化后的索引,處理方法是,在sql語(yǔ)句中指定 使用某個(gè)索引。
網(wǎng)上說(shuō) 加limit不是導(dǎo)致 mysql使用不同索引的原因,這還是和mysql的 語(yǔ)法解析器有關(guān),還有與mysql的版本有關(guān)系。
強(qiáng)制索引是一種簡(jiǎn)單的解決這類問題的辦法。
如下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 的組合索引。