Mysql 只查状态字段优化
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.
如题,表有 300 万数据的样子,状态字段是 varchar 的,只有 5 个状态,只查某个状态的全部数据时很慢,状态字段加索引也没用,怎么解决
brader 2 小时 11 分钟前 sql 语句试下强制指定索引
|
hhjswf 2 小时 4 分钟前 via Android 只有 5 个状态,你加个 der 的索引。。浪费空间,增加插入开销。索引要用在有区分度的字段。
同步到 es 库查询? |
lookStupiToForce 2 小时 3 分钟前 “只有 5 个状态,只查某个状态的全部数据时很慢”
你的意思是每个状态平均 60 万行数,然后你要一次取出这么多的数据? 慢是当然的,mysql 的优化器要么走全表扫,要么走索引然后来 60 万次(准)随机 IO ,都会慢 你真有这种业务需求,要么上 redis ,要么按这个状态字段建分区表,前者当然更好,后者如果你用的 ssd 性能也够用,硬盘的话,看你这 60 万行数到底占多大空间了 |
xwayway 2 小时 0 分钟前 5 个字段,区分度并不高啊。散列散列,所以还是没懂散的意思啊。
我猜你是不是 select * from xxx where status = 'xxx' 查询的,要不先改成 select * from xxx where id in(select id from xxx where status = 'xxxx')? |
jtwor 1 小时 45 分钟前 看看执行计划,先确认是否命中索引
|
sujin190 1 小时 44 分钟前 区分度不高索引没啥用,你看下查询计划这种情况应该是不会用状态索引的,如果有 limit 限制数量且不多的情况下不会慢的,如果还慢应该是加了排序了吧,这种情况应该是排序慢,也许你需要加索引的字段是排序字段才对
|
devilweime 1 小时 42 分钟前 让交互改下,再加个默认时间查询范围之类
|
fiypig 1 小时 38 分钟前 看业务场景, 加时间条件
|
4lieS 1 小时 29 分钟前 你这慢不是慢在索引,是慢在平均 60W 次的磁盘读写数据上了。
可以尝试加上其他查询条件创建联合索引,比如(时间,状态)这样。 |
spicy777 1 小时 23 分钟前 怎么感觉不像说的那么回事,把表结构贴下呗
|
liuxu 1 小时 10 分钟前 5 个固定状态数量不用 varchar ,用 enum ,再检查下带宽,300 万 varchar 二级索引问题不大
|
urnoob 59 分钟前 尝试下建 hash 索引。这种索引类型,理论上你这列就只有五个 hash 值。
避免全表扫描,只需要扫描只有 5 条记录的 hash 索引记录 有尝试的话麻烦反馈下结果 |
opengps 13 分钟前 你这 5 个状态,是不是可以用 5 个表去存呢?
|
seth19960929 13 分钟前 先用 ID 取范围比如,
id > 0 && id <= 30000 and status=xxx id > 30000 && id <= 60000 and status=xxx 然后开 100 个线程去查询 |
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK