
如题,表有 300 万数据的样子,状态字段是 varchar 的,只有 5 个状态,只查某个状态的全部数据时很慢,状态字段加索引也没用,怎么解决
1 brader 2023-05-09 10:14:15 +08:00 sql 语句试下强制指定索引 |
2 hhjswf 2023-05-09 10:22:10 +08:00 via Android 只有 5 个状态,你加个 der 的索引。。浪费空间,增加插入开销。索引要用在有区分度的字段。 同步到 es 库查询? |
3 lookStupiToForce 2023-05-09 10:22:57 +08:00 “只有 5 个状态,只查某个状态的全部数据时很慢” 你的意思是每个状态平均 60 万行数,然后你要一次取出这么多的数据? 慢是当然的,mysql 的优化器要么走全表扫,要么走索引然后来 60 万次(准)随机 IO ,都会慢 你真有这种业务需求,要么上 redis ,要么按这个状态字段建分区表,前者当然更好,后者如果你用的 ssd 性能也够用,硬盘的话,看你这 60 万行数到底占多大空间了 |
4 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')? |
5 jtwor 2023-05-09 10:40:32 +08:00 看看执行计划,先确认是否命中索引 |
6 sujin190 2023-05-09 10:41:39 +08:00 区分度不高索引没啥用,你看下查询计划这种情况应该是不会用状态索引的,如果有 limit 限制数量且不多的情况下不会慢的,如果还慢应该是加了排序了吧,这种情况应该是排序慢,也许你需要加索引的字段是排序字段才对 |
7 devilweime 2023-05-09 10:43:54 +08:00 让交互改下,再加个默认时间查询范围之类 |
8 fiypig 2023-05-09 10:47:29 +08:00 看业务场景, 加时间条件 |
9 4lieS 2023-05-09 10:56:30 +08:00 你这慢不是慢在索引,是慢在平均 60W 次的磁盘读写数据上了。 可以尝试加上其他查询条件创建联合索引,比如(时间,状态)这样。 |
10 spicy777 2023-05-09 11:02:42 +08:00 怎么感觉不像说的那么回事,把表结构贴下呗 |
11 liuxu 2023-05-09 11:15:52 +08:00 5 个固定状态数量不用 varchar ,用 enum ,再检查下带宽,300 万 varchar 二级索引问题不大 |
12 urnoob 2023-05-09 11:26:18 +08:00 尝试下建 hash 索引。这种索引类型,理论上你这列就只有五个 hash 值。 避免全表扫描,只需要扫描只有 5 条记录的 hash 索引记录 有尝试的话麻烦反馈下结果 |
14 marine2c OP @xwayway 差不多是这个意思,但是你 select id from xxx where status = 'xxxx'不还是走全表扫描么 |
19 opengps &nbs; 2023-05-09 12:12:18 +08:00 你这 5 个状态,是不是可以用 5 个表去存呢? |
20 SethShi 2023-05-09 12:13:10 +08:00 先用 ID 取范围比如, id > 0 && id <= 30000 and status=xxx id > 30000 && id <= 60000 and status=xxx 然后开 100 个线程去查询 |
21 Xusually 2023-05-09 12:35:57 +08:00 只有 5 个状态的话,加索引除了徒增 io 外没啥作用。 还是尝试走其他查询条件的索引先缩小扫描范围。 |
22 lovelylain 2023-05-09 12:47:47 +08:00 via Android 只有 5 个状态,状态有索引,A 状态有 299 万数据,其他状态 1 万数据,查其他状态应该能走索引吧,查 A 不会走,如果每个状态都差不多多,可能也不会走。 |
23 ksc010 2023-05-09 12:59:28 +08:00 要不要先把这个几个状态修改为枚举 |
24 zhzy0077 2023-05-09 13:23:34 +08:00 每次要查 60 万行数据?是明细结果还是聚合结果? 60 万行明细数据查出来要做啥?如果是聚合结果的话就按照正常的 OLAP 的实践去做就好了 |
25 wolfie 2023-05-09 13:40:37 +08:00 枚举建索引,增加开销()、提高速度() 贴表结构,常用查询条件。 |
26 CaptainAmerica 2023-05-09 13:41:04 +08:00 区分度太低了 索引没啥用的 |
27 bk201 2023-05-09 13:43:14 +08:00 分页获取数据,比如一次拉取 100 条。应该没有场景需要一次性拉去 60 多万数据的。 |
29 zhzy0077 2023-05-09 14:27:48 +08:00 @marine2c 定时任务多就跑一次?比如 5 分钟跑一回,那你只要遍历过去 5 分钟新增的数据就行了,还是说你每个定时周期都会有 300 万行新数据? 如果是每个定时周期都会有 300 万行新数据的话,最好和业务对一下能不能用流的方式去做 |
31 Tenlearn 2023-05-09 14:38:25 +08:00 没有时间字段吗?这数据量会不会越来越大,传统 DB 起码再加个时间 |
32 Ayanokouji 2023-05-09 15:35:59 +08:00 定时任务加时间范围 |
33 emmmbu 2023-05-09 16:01:49 +08:00 状态异常的也不会很多吧,状态字段加索引吧 |