mysql的limit优化_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 的组合索引。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值