Mysql 只查状态字段优化

2023-05-09 10:06:49 +08:00
 marine2c

如题,表有 300 万数据的样子,状态字段是 varchar 的,只有 5 个状态,只查某个状态的全部数据时很慢,状态字段加索引也没用,怎么解决

2921 次点击
所在节点    程序员
34 条回复
Xusually
2023-05-09 12:35:57 +08:00
只有 5 个状态的话,加索引除了徒增 io 外没啥作用。
还是尝试走其他查询条件的索引先缩小扫描范围。
lovelylain
2023-05-09 12:47:47 +08:00
只有 5 个状态,状态有索引,A 状态有 299 万数据,其他状态 1 万数据,查其他状态应该能走索引吧,查 A 不会走,如果每个状态都差不多多,可能也不会走。
ksc010
2023-05-09 12:59:28 +08:00
要不要先把这个几个状态修改为枚举
zhzy0077
2023-05-09 13:23:34 +08:00
每次要查 60 万行数据?是明细结果还是聚合结果?
60 万行明细数据查出来要做啥?如果是聚合结果的话就按照正常的 OLAP 的实践去做就好了
wolfie
2023-05-09 13:40:37 +08:00
枚举建索引,增加开销(✔)、提高速度(❌)
贴表结构,常用查询条件。
CaptainAmerica
2023-05-09 13:41:04 +08:00
区分度太低了 索引没啥用的
bk201
2023-05-09 13:43:14 +08:00
分页获取数据,比如一次拉取 100 条。应该没有场景需要一次性拉去 60 多万数据的。
marine2c
2023-05-09 14:11:23 +08:00
@zhzy0077
@bk201 定时任务处理状态异常的,每次会 limit 500 ,但还是很慢
zhzy0077
2023-05-09 14:27:48 +08:00
@marine2c 定时任务多就跑一次?比如 5 分钟跑一回,那你只要遍历过去 5 分钟新增的数据就行了,还是说你每个定时周期都会有 300 万行新数据?
如果是每个定时周期都会有 300 万行新数据的话,最好和业务对一下能不能用流的方式去做
Tenlearn
2023-05-09 14:35:57 +08:00
@xwayway 括号里的语句不还是通过辅助索引回表吗?跟直接 Status 查记录底层一样的吧?
Tenlearn
2023-05-09 14:38:25 +08:00
没有时间字段吗?这数据量会不会越来越大,传统 DB 起码再加个时间
Ayanokouji
2023-05-09 15:35:59 +08:00
定时任务加时间范围
emmmbu
2023-05-09 16:01:49 +08:00
状态异常的也不会很多吧,状态字段加索引吧
xuanbg
2023-05-09 19:24:24 +08:00
@hhjswf 状态最终总归要变成最终的那个值的,所以不是没有区分度。在查中间状态时,反而有特别大的区分度。我估计 OP 查的某个状态是最终状态,所以索引毫无作用。

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

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

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

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

© 2021 V2EX