MySQL 两亿条数据的表用索引也要 1 秒才能查出结果,还有办法优化吗?

138 天前
 drymonfidelia
4836 次点击
所在节点    数据库
44 条回复
orczhou
133 天前
@drymonfidelia 索引使用看起来没什么问题。考虑增加 MySQL/InnoDB 的内存,也就是调大参数 innodb_buffer_pool ,然后把所有的数据查一遍加载到内存( warm up ),再试试。内存充足,性能应该在几毫秒以内
dyv9
102 天前
@drymonfidelia 那我猜想按年分表,反 t 正都不用,何必一直占着坑
wxf666
81 天前
@drymonfidelia 你 type IN (...) 少的时候,是不是能快些?

若是,我猜是 MySQL 去匹配不同范围的次数太多了。

如果你要的数据,都比较集中在最新添加的几天内,那么只使用一个范围,应该能提速很多。


假设你的 record_id 越大,created_at 也越大。

则可以:select record_id FROM qcs.records x WHERE `query` = "DEMOQUERY1111" ORDER BY record_id DESC;

这会使用你的 record_query_IDX 索引。

接着,你在程序内,一条条读取,直到 (1,2,4,7,2510,27442,440097,800022) 的 type 全部有数据为止。

最后,再根据得到的 record_id 集合,去主表拿整行数据。
wxf666
81 天前
@drymonfidelia 噢,漏了一些东西。

你的 record_query_IDX 索引,没有 type 。。

那就建个 (query, record_id, type) 的索引?

然后 SQL 是 select record_id, type FROM qcs.records x WHERE `query` = "DEMOQUERY1111" ORDER BY record_id DESC;

后续参考上一楼。

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

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

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

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

© 2021 V2EX