MYSQL LIMIT 使用优化技巧

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 的组合索引。

你可能感兴趣的:(MYSQL LIMIT 使用优化技巧)