Mysql in查询慢优化方法

表总共记录800w:

           mysql中in集合中只有20个左右,查询时间大约6s,无法走索引

           例如:

SELECT
 sum(num)
FROM
 `****`
WHERE
 `create_time` >= 1584892800
AND `create_time` < 1584979200
AND `source` = 5
AND `uid` IN (
 23, 24, 26, 29, 32, 33, 38, 42, 52, 59, 68, 69, 71, 72, 73, 79, 83,
 85, 108, 111, 139, 229, 261, 280, 281, 283, 296, 298, 308, 401, 423,
 490, 523, 650, 653, 776, 903, 913, 966, 997, 1030, 1381, 1704, 1809)
AND `coin_id` = 1
LIMIT 1

原因1:in中结合条件太多,mysql认为全表检索比索引要快,就不走索引了;

原因2:mysql参数eq_range_index_dive_limit设置太小,导致in不走索引

解决方案:

1.语句强制走索引,tp5可以db('*** force index(idx_x5)')即可强制走索引

SELECT
 sum(num)
FROM
 `****` force index(idx_x5)
WHERE
 `create_time` >= 1584892800
AND `create_time` < 1584979200
AND `source` = 5
AND `uid` IN (
 23, 24, 26, 29, 32, 33, 38, 42, 52, 59, 68, 69, 71, 72, 73, 79, 83,
 85, 108, 111, 139, 229, 261, 280, 281, 283, 296, 298, 308, 401, 423,
 490, 523, 650, 653, 776, 903, 913, 966, 997, 1030, 1381, 1704, 1809)
AND `coin_id` = 1
LIMIT 1

2.eq_range_index_dive_limit参数调大到200,sql即可自动走索引,不用强制

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值