一个 MYSQL 语句加索引的问题

2017-10-10 09:47:11 +08:00
 jamfer
EXPLAIN SELECT * FROM A WHERE a=0 AND b='hk' ORDER BY c DESC

如上,很简单的 SQL 语句,表 A 大约有 30 万条数据。

我给 a 字段和 b 字段都加了 index 索引。但结果返回的行数还是太多( 10 万行)导致查询缓慢。有没有更好的优化办法
1951 次点击
所在节点    问与答
15 条回复
qiayue
2017-10-10 09:48:08 +08:00
c 也要
jamfer
2017-10-10 09:51:20 +08:00
@qiayue 试了给 c 也加上,还是一样 10 万行
Ison
2017-10-10 09:54:35 +08:00
查询缓慢的原因是匹配的项目多
重点在于在查询过程尽早缩小查询匹配项目的范围
如果你本来的匹配目标就多那再优化也没用
如果你匹配目标少但现在返回的多
那就把多缩小范围最有效的过滤条件提前
tabris17
2017-10-10 09:55:43 +08:00
什么叫“ a 字段和 b 字段都加了 index 索引”

你这应该加联合索引才行啊
jamfer
2017-10-10 09:56:59 +08:00
@tabris17 联合索引结果也是一样...
tabris17
2017-10-10 10:00:12 +08:00
『返回…… 10 万行……导致查询缓慢』

我还能说啥呢
armoni
2017-10-10 10:05:42 +08:00
10 万行 光数据量就多大了, 你这种情况如果是页面查询就做分页,如果是拿出来计算就另外想办法吧
jamfer
2017-10-10 10:14:26 +08:00
@tabris17
@armoni Sorry 我没说清楚,是有 limit x,30 的。
mitoop
2017-10-10 12:47:58 +08:00
a 或者 b 这个列的区分度不够吧
vindurriel
2017-10-10 14:30:59 +08:00
mysql 每次只能用一个索引,因此需要 联合索引 (a,b,c) 。如果(a,b) 区分度够大的话只索引(a,b)也可以,不过 order by c 的过程就得排序了
select * 真的有必要吗?用索引查出 id 列表之后再去主键索引找完整的数据行(假定引擎是 innodb ),会增加很多随机读。
ToTChowChow
2017-10-10 16:24:06 +08:00
如果有主键 ID 的话,可以先 select id from ...,
然后再根据 id 获取数据
mooncakejs
2017-10-10 19:37:05 +08:00
limit 10w,30 不管什么索引都慢的。
jamfer
2017-10-10 19:39:47 +08:00
@mooncakejs 可是现在 1,30 都卡的要死...
gzxultra
2017-10-10 21:21:18 +08:00
你倒是把建好的索引和 explain 的结果贴上来啊...
Lonely
2017-10-10 21:43:18 +08:00
show index 的结果贴一下

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

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

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

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

© 2021 V2EX