MySQL 该不该给 status 添加索引?

2020-04-28 18:47:02 +08:00
 zealinux

现在某个表,有个 status,有两个值,0,1

按照好多文档说明,这列不应该加索引。

比如,0 是未处理的,1 是处理过的。

一般都是要查 0,来进行处理。

发现 status 加了索引之后,查找的速度飞快。

2000w 的表,SELECT COUNT(*), 从 14s 下降到 0.1s 以下( SQL_NO_CACHE )

5860 次点击
所在节点    MySQL
28 条回复
GTim
2020-04-28 18:53:21 +08:00
加了索引,`select count(*)` 走的是索引,索引比起原表那真是小太多了
gotonull
2020-04-28 18:53:51 +08:00
status 加索引对 count 有影响?不懂,插眼。等一个大佬解释
virusdefender
2020-04-28 18:55:46 +08:00
status 加索引对 count 有影响?+1

看下 explain 的结果
yumenawei
2020-04-28 18:57:37 +08:00
这个是特例。
你随便查点需要回表的数据试试。
sadfQED2
2020-04-28 19:01:54 +08:00
Count 操作不会回表,你试试 select *
xuanbg
2020-04-28 19:19:14 +08:00
这种看情况,索引就是使无序的数据变得有序,相当于让乱糟糟的一群人按某种特性排起了整齐的队伍。如果你需要找的人在队伍里面占大多数,那这个队伍没多大意思。如果你要找的是队伍里面的少数人,那效率提升就是杠杠的。
xinshoushanglu
2020-04-28 19:24:50 +08:00
count 应该是在 mysql.sys 表里记录的一个量,和数据表的规模没关系。我之前一张一千多万的表,查都查不动,但是 count(1)或者 count(*) 还是秒出
encro
2020-04-28 19:32:18 +08:00
索引对于量少的数据有效。

比如你表数据绝大部分都是 status=0 的,
但是你查询是 status=1 的数据,这时候索引有效的,也是很快的,
如果你查 status=0,因为数据量超过了总数一般,那么索引无效。
glacer
2020-04-28 20:36:13 +08:00
加索引有效的原因是 0 和 1 的数据量不均等吧。如果 0 只占很小一部分,status=0 的时候当然很快
PopRain
2020-04-28 20:38:22 +08:00
@xinshoushanglu 人家是做条件 count, 不是统计全表的行数。 状态值用索引快是因为一个 Page 可以保存更多的记录,就算走索引全扫描,所需要的 I/O 比表扫描也少的多
napsterwu
2020-04-28 20:41:43 +08:00
区分度不大的字段加索引效果不大吧
wdlth
2020-04-28 20:45:57 +08:00
应该与其他的字段一起加联合索引,单独加不一定能用上。
gongwenhua
2020-04-28 21:23:29 +08:00
截个图看看 explain ?
daozhihun
2020-04-28 21:25:29 +08:00
不建议加索引,筛选的行数太少,系统很可能会忽略掉
cheng6563
2020-04-28 21:27:01 +08:00
这算是个特殊用法吧
jam1024
2020-04-28 21:50:40 +08:00
建议加组合索引,不建议加单独索引
Orenoid
2020-04-28 21:57:25 +08:00
status 这种选择性很低的列,单独加索引收益很低
love
2020-04-28 21:59:51 +08:00
这个状态很少的列要看数据分布的。如果是分布很平均就不用加。
dongisking
2020-04-28 22:00:52 +08:00
不建议,建议分表
uxff
2020-04-28 22:20:29 +08:00
加索引快是因为直接读索引就能统计到条数。而不需要再读表内容,减少了 io 次数。不加索引会增加额外的 io 开销。
读完索引再读表内容一般至少多加一次 io,除非表很小(在 B+数的一簇以内)。
如果不加索引,且 status=0 的值很多,分散在不同的簇上,那就很慢,需要很多次 io 。

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

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

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

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

© 2021 V2EX