7

Mysql 只查状态字段优化

 1 year ago
source link: https://www.v2ex.com/t/938494
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

V2EX  ›  程序员

Mysql 只查状态字段优化

  marine2c · 2 小时 19 分钟前 · 491 次点击

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

20 条回复    2023-05-09 12:13:10 +08:00
brader

brader      2 小时 11 分钟前

sql 语句试下强制指定索引
hhjswf

hhjswf      2 小时 4 分钟前 via Android

只有 5 个状态,你加个 der 的索引。。浪费空间,增加插入开销。索引要用在有区分度的字段。
同步到 es 库查询?
lookStupiToForce

lookStupiToForce      2 小时 3 分钟前

“只有 5 个状态,只查某个状态的全部数据时很慢”
你的意思是每个状态平均 60 万行数,然后你要一次取出这么多的数据?

慢是当然的,mysql 的优化器要么走全表扫,要么走索引然后来 60 万次(准)随机 IO ,都会慢
你真有这种业务需求,要么上 redis ,要么按这个状态字段建分区表,前者当然更好,后者如果你用的 ssd 性能也够用,硬盘的话,看你这 60 万行数到底占多大空间了
xwayway

xwayway      2 小时 0 分钟前

5 个字段,区分度并不高啊。散列散列,所以还是没懂散的意思啊。
我猜你是不是 select * from xxx where status = 'xxx' 查询的,要不先改成 select * from xxx where id in(select id from xxx where status = 'xxxx')?
jtwor

jtwor      1 小时 45 分钟前

看看执行计划,先确认是否命中索引
sujin190

sujin190      1 小时 44 分钟前

区分度不高索引没啥用,你看下查询计划这种情况应该是不会用状态索引的,如果有 limit 限制数量且不多的情况下不会慢的,如果还慢应该是加了排序了吧,这种情况应该是排序慢,也许你需要加索引的字段是排序字段才对
devilweime

devilweime      1 小时 42 分钟前

让交互改下,再加个默认时间查询范围之类
fiypig

fiypig      1 小时 38 分钟前

看业务场景, 加时间条件
4lieS

4lieS      1 小时 29 分钟前

你这慢不是慢在索引,是慢在平均 60W 次的磁盘读写数据上了。
可以尝试加上其他查询条件创建联合索引,比如(时间,状态)这样。
spicy777

spicy777      1 小时 23 分钟前

怎么感觉不像说的那么回事,把表结构贴下呗
liuxu

liuxu      1 小时 10 分钟前

5 个固定状态数量不用 varchar ,用 enum ,再检查下带宽,300 万 varchar 二级索引问题不大
urnoob

urnoob      59 分钟前

尝试下建 hash 索引。这种索引类型,理论上你这列就只有五个 hash 值。
避免全表扫描,只需要扫描只有 5 条记录的 hash 索引记录
有尝试的话麻烦反馈下结果
marine2c

marine2c      29 分钟前

@brader
@hhjswf 状态索引没用,走的全表扫描
marine2c

marine2c      28 分钟前

@xwayway 差不多是这个意思,但是你 select id from xxx where status = 'xxxx'不还是走全表扫描么
marine2c

marine2c      28 分钟前

@urnoob 还没尝试,hash 索引没用过
brader

brader      26 分钟前

@marine2c #13 所以我才让你强制指定索引啊,你尝试指定了没有
marine2c

marine2c      24 分钟前

@brader 状态没建索引啊,这种索引建了不会被大佬屌么,哈哈
brader

brader      20 分钟前

@marine2c #17 这点自主权都没有吗,你们管开发管这么死了,别人能实现需求不就行了
opengps

opengps      13 分钟前

你这 5 个状态,是不是可以用 5 个表去存呢?
seth19960929

seth19960929      13 分钟前

先用 ID 取范围比如,
id > 0 && id <= 30000 and status=xxx
id > 30000 && id <= 60000 and status=xxx
然后开 100 个线程去查询

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK