Mysql 只查状态字段优化

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

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

3267 次点击
所在节点    程序员
34 条回复
brader
2023-05-09 10:14:15 +08:00
sql 语句试下强制指定索引
hhjswf
2023-05-09 10:22:10 +08:00
只有 5 个状态,你加个 der 的索引。。浪费空间,增加插入开销。索引要用在有区分度的字段。
同步到 es 库查询?
lookStupiToForce
2023-05-09 10:22:57 +08:00
“只有 5 个状态,只查某个状态的全部数据时很慢”
你的意思是每个状态平均 60 万行数,然后你要一次取出这么多的数据?

慢是当然的,mysql 的优化器要么走全表扫,要么走索引然后来 60 万次(准)随机 IO ,都会慢
你真有这种业务需求,要么上 redis ,要么按这个状态字段建分区表,前者当然更好,后者如果你用的 ssd 性能也够用,硬盘的话,看你这 60 万行数到底占多大空间了
xwayway
2023-05-09 10:25:54 +08:00
5 个字段,区分度并不高啊。散列散列,所以还是没懂散的意思啊。
我猜你是不是 select * from xxx where status = 'xxx' 查询的,要不先改成 select * from xxx where id in(select id from xxx where status = 'xxxx')?
jtwor
2023-05-09 10:40:32 +08:00
看看执行计划,先确认是否命中索引
sujin190
2023-05-09 10:41:39 +08:00
区分度不高索引没啥用,你看下查询计划这种情况应该是不会用状态索引的,如果有 limit 限制数量且不多的情况下不会慢的,如果还慢应该是加了排序了吧,这种情况应该是排序慢,也许你需要加索引的字段是排序字段才对
devilweime
2023-05-09 10:43:54 +08:00
让交互改下,再加个默认时间查询范围之类
fiypig
2023-05-09 10:47:29 +08:00
看业务场景, 加时间条件
4lieS
2023-05-09 10:56:30 +08:00
你这慢不是慢在索引,是慢在平均 60W 次的磁盘读写数据上了。
可以尝试加上其他查询条件创建联合索引,比如(时间,状态)这样。
spicy777
2023-05-09 11:02:42 +08:00
怎么感觉不像说的那么回事,把表结构贴下呗
liuxu
2023-05-09 11:15:52 +08:00
5 个固定状态数量不用 varchar ,用 enum ,再检查下带宽,300 万 varchar 二级索引问题不大
urnoob
2023-05-09 11:26:18 +08:00
尝试下建 hash 索引。这种索引类型,理论上你这列就只有五个 hash 值。
避免全表扫描,只需要扫描只有 5 条记录的 hash 索引记录
有尝试的话麻烦反馈下结果
marine2c
2023-05-09 11:56:45 +08:00
@brader
@hhjswf 状态索引没用,走的全表扫描
marine2c
2023-05-09 11:57:20 +08:00
@xwayway 差不多是这个意思,但是你 select id from xxx where status = 'xxxx'不还是走全表扫描么
marine2c
2023-05-09 11:57:59 +08:00
@urnoob 还没尝试,hash 索引没用过
brader
2023-05-09 11:59:45 +08:00
@marine2c #13 所以我才让你强制指定索引啊,你尝试指定了没有
marine2c
2023-05-09 12:01:59 +08:00
@brader 状态没建索引啊,这种索引建了不会被大佬屌么,哈哈
brader
2023-05-09 12:05:33 +08:00
@marine2c #17 这点自主权都没有吗,你们管开发管这么死了,别人能实现需求不就行了
opengps
2023-05-09 12:12:18 +08:00
你这 5 个状态,是不是可以用 5 个表去存呢?
seth19960929
2023-05-09 12:13:10 +08:00
先用 ID 取范围比如,
id > 0 && id <= 30000 and status=xxx
id > 30000 && id <= 60000 and status=xxx
然后开 100 个线程去查询

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

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

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

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

© 2021 V2EX