1.limit 分页优化
如果数据量很大页数较多,limit 偏移量越大 就会查询的速度越慢。
原因是 偏移量越大扫描的行数越多 ,比如 limit 100000 , 10 ,意思是扫描符合条件的 1000010 只要后 10条记录,这样偏移量越大扫描行数越多,就越慢。
改为关联子查询会较快些,把多表筛选 limit 改为 单表。与之前相比 会快些。
如下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;
优化后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 //新增子查询优化
WHERE fa.ID=TFA.ID ;
优化后 查询时间会缩短原来的 几十倍到几百倍不等。
2,查询数据时候 发现加上了 limit 1 ,sql不会使用之前优化后的索引,处理方法是,在sql语句中指定 使用某个索引。
网上说 加limit不是导致 mysql使用不同索引的原因,这还是和mysql的 语法解析器有关,还有与mysql的版本有关系。
强制索引是一种简单的解决这类问题的办法。
如下sql:
SELECT
a.ID,
a.AUCTION_ID
FROM
BOSS_FINANCE_APPLY a FORCE INDEX(IDX_STATUS_TYPE) //指定使用某个索引
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 的组合索引。
网友评论