请教一条 mysql 慢查询问题

2020-02-22 14:29:49 +08:00
 zuiye111
有一张表,大概 180w 条数据,有一条 sql,如下
```
select * from order where 1 = 1 and user_id = 12345 and mchcode = '56789' and (0 or order_state = 2 or order_state = 4 or order_state = 5 ) and (order_property_bit & 128)=128 and channel_type = 2 order by create_time desc LIMIT 1 OFFSET 0;
```
查询花了 5s,我 explain 了下这条 sql,大概是这样的

-------+---------------+-------------+---------+------+------+----------+-------------+
| type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+-------+-------+-------+-------------+---------+------+------+----------+-------------+
| index | mchcode | create_time | 5 | NULL | 1311 | 0.00 | Using where |
+-------------+-------------------------+------------+-------+---------------+----------

可见,确实用到了索引 create_time,但为何还是这么慢呢?
我的表索引结构大概是这样的
PRIMARY KEY (`auto_id`),
UNIQUE KEY `order_id` (`order_id`),
KEY `user_id` (`user_id`),
KEY `create_time` (`create_time`),
KEY `mchcode` (`mchcode`)

字段:`mchcode` varchar(20) DEFAULT NULL, `create_time` int(11) DEFAULT NULL, mchcode 是字符串,create_time 是时间戳,都建了索引

在查问题过程中,还发现一些很奇怪的问题,就是这条 sql,有时查又很快,快的时候,我 explain 时,发现索引用的是 mchcode,慢的时候,如上,索引用的是 create_time,为何同样一条 sql,会用不同的索引呢,为何用 mchcode 索引查时快,用 create_time 时慢呢?
4742 次点击
所在节点    MySQL
45 条回复
akira
2020-02-22 23:59:46 +08:00
order_property_bit & 128 这种用法不建议。 如果确实必要,那还不如额外建个列来保存这个数值。
qza1212
2020-02-23 03:49:02 +08:00
#2 楼提到了问题的关键

mysql 查询优化器要么用 mchcode 索引 要么用 create_time 索引 (假如 where 只考虑 mchcode )

1 如果用 mchcode 索引:从 mchcode 索引树里拿到所有满足条件的主键->回表->排序拿到第一个
优点是用到 mchcode 索引,查询比较快 缺点是要排序

2 如果用 create_time 索引:对 create_time 索引树扫全表->每次都要回表判断 where 条件->一旦满足条件直接返回
优点是不用额外排序了,缺点是 where 条件过滤无法用到索引,只能全表扫描

所以如果 mchcode 过滤之后结果非常多,导致额外的排序非常耗时那么 2 比较好,反之 1 比较好
查询优化器根本无法判断,这种只有执行了才知道
sansanhehe
2020-02-23 09:03:12 +08:00
建立多列索引不香吗:user_id + mchcode + createtime
encro
2020-02-23 10:19:53 +08:00
1,大多数情况 create_time 索引不是需要的。。。要也是放在组合索引末尾,除非你前台大量 between 类查询。
2,Or 查询和 in 查询不能很好利用组合索引;
3, order_property_bit & 128 不能很好利用索引;
4,查询优化器自动预估,不知道你的 possible_keys 为什么没有 user_id
zuiye111
2020-02-23 14:47:54 +08:00
感谢上述各位大佬解答,很有参考意义

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/646603

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX