Mysql 的一个困惑,求解答

2015-12-19 22:01:54 +08:00
 jsrgqinbin

150W 条记录的一个订单表。

mysql> select * from orders where error_status = 0 AND line_id = 0 limit 1;
1 row in set (0.01 sec)
mysql> select * from orders where error_status = 0 AND line_id = 0 and version=3 limit 1; 1 row in set (10.01 sec)

以上两个查询效率相差太大了, error_status , line_id 都建了索引,就加了一个 version 的条件。

version 为 tinyint 型的基数比较小,只有 0 , 1 , 2 , 3 这 4 个值。

尝试 version 添加索引,对查询效率没有提高。

有人指点下,为啥加了 version 就特别慢

2177 次点击
所在节点    问与答
11 条回复
kn007
2015-12-19 22:08:57 +08:00
试试联合索引?
忘记哪个脚本有索引建立推荐。。。
msg7086
2015-12-19 22:14:35 +08:00
后者要用 (error_status, line_id, version) 联合索引。
billlee
2015-12-19 22:45:38 +08:00
先 EXPLAIN 看一下
shiny
2015-12-19 22:47:01 +08:00
前一条有没有 Query Cache?先 explain 吧……
holyghost
2015-12-19 22:51:05 +08:00
我不太懂,但是感觉 5.6 可以用 index condition pushdown 解决一部分这样的问题。

求轻打脸。
lenran
2015-12-19 22:55:46 +08:00
version 字段唯一性不高,不应该创建索引吧
test1199
2015-12-19 23:48:43 +08:00
语句顺序: version 放前边, 那俩有索引得放后边
guoer
2015-12-20 11:23:37 +08:00
@test1199 mysql 会自动调整顺序吧
jsrgqinbin
2015-12-21 09:06:44 +08:00
@test1199 试过,效果一样
jsrgqinbin
2015-12-21 09:09:56 +08:00
@billlee 使用的索引以及影响的行数是一样的
toben
2015-12-21 16:03:47 +08:00
感觉只有这 3 个字段的联合索引会变快=.=!

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

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

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

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

© 2021 V2EX