Mysql 命中索引后仍然有大量数据该如何处理

2019-03-21 06:32:26 +08:00
 snappyone

刚在看高性能 Mysql 的时候突然看到的一个例子,正好又联想起几年前被面试到的一个问题:

Mysql 在查询的时候虽然命中了索引,但是因为该索引对应的记录非常多,达到几百上千万,该如何处理?

书中的解决方法是修改应用代码,区分该类特殊数据,禁止针对这部分条件的查询。 不知道各位有没有更好的解决方案呢

3214 次点击
所在节点    程序员
16 条回复
veike
2019-03-21 07:24:30 +08:00
处理过 260 万的数据,加了索引查询毫秒级的。只要不 count,只 limit 的速度非常快,count 的话在 0.8s 的花费时间,放服务器上应该更快。
不知道你说的几百万是几。查询到这么多的数据要如何处理,是处理什么呢。
Varobjs
2019-03-21 07:37:07 +08:00
使用自增主键当模拟游标,每次 limit
例如 where id > n * 10w and id < n+1 * 10w limit 100
yidinghe
2019-03-21 07:43:35 +08:00
如果某个索引命中后仍然要在几十万条记录里面挑一两条,那么说明这个索引不适合这个查询,需要另选其他索引。
des
2019-03-21 07:46:45 +08:00
@veike
如果是要 group by 然后 order,再 limit 呢?
anyele
2019-03-21 08:07:48 +08:00
@des 那就很慢
veike
2019-03-21 08:08:11 +08:00
@des 来个具体的 group by order limit
agostop
2019-03-21 08:24:29 +08:00
一个索引对应几百万条数据,那么总的数据量是多大?
如果总数据量也就 1 千万,那证明这个索引建的不合适,或者需要配合其他字段来建立索引;
如果索引确实没问题,表的确非常大,那么我想应该先考虑分区比较合适
Joyboo
2019-03-21 11:04:02 +08:00
同意楼上的,索引命中后还这么大数量级,只能说明这个索引不适合这个场景,数据量大分区是必须的
reus
2019-03-21 11:19:20 +08:00
那就处理啊
daviswei
2019-03-21 11:23:00 +08:00
优先考虑从业务逻辑上进行优化,这个是收益最大的。
次选进行分表。
yangg
2019-03-21 15:14:14 +08:00
@daviswei 和 lz 有同样的问题,业务并不好分表
是一个记录表有
company_id, user_id, price ...其它字段
1, 222, +30
1, 333, -30
1, 444, +30
1, 333, -30
因为公司里所有人的操作的消费都会从 管理员身上扣所以,管理员的数据特别多
这样感觉没法分表,用 company_id 来分表的话,分太多了,也不太好管理。
snappyone
2019-03-21 17:38:13 +08:00
@yangg 对的,你这个例子就是书里头写的,因为把很大一部分数据都划归给了 admin,所以导致查询一下命中大量数据,我想了下你是否可以用管理员+其他字段多存一个 hash 到原始表中,下次查询的时候条件就写 where hash=? and user_id=?
snappyone
2019-03-21 17:39:08 +08:00
@veike 应不一样,不是总表百万,是单纯一条查询命中索引后依然还有百万级数据
snappyone
2019-03-21 17:39:57 +08:00
@daviswei 我犹记得我当初面试也是这么说的,但是人家说不考虑业务,就只能技术解决
dengtongcai
2019-03-21 21:11:15 +08:00
换字段建立索引
qsbaq
2019-03-22 08:59:01 +08:00
就是索引不合适了,需要重新建立。

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

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

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

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

© 2021 V2EX