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

286 天前
 drymonfidelia
5025 次点击
所在节点    数据库
44 条回复
BugCry
286 天前
同单表 2 亿,用分区表性能爆炸
drymonfidelia
286 天前
@crazyweeds 试了分区,看起来提升不是很大
drymonfidelia
286 天前
@IwfWcf 是阿里云的系统盘,应该是 SSD
@sujin190 阿里云的实例,内存 32GB
yidinghe
286 天前
优化思路大概是两个方面:

1. 尽可能减少扫描记录数。索引和分区就是起这个作用的。
2. 尽可能减少选取字段数。首先可以的话只选索引包含的字段,其次避免选取 text 等外部引用的字段。
3. 极端情况下,可以在先带业务条件查出记录的主键列表后,做二次查询来填充其余字段。这个在分页查询中比较有用,因为第二次查询可以并发执行,所以有可能总耗时反而更少。
fallingg
286 天前
有排除网络因素吗?如果执行 select 1 时间是多少
RangerWolf
286 天前
建议试试看分两步查询
1. 第一步先 Select record_id
2. 第二步再试试看 select x.* from xxx qcs.records x where record _id in ( ... )

上面有同学已经提到类似的改进了
vibbow
286 天前
@drymonfidelia ECS 的话就别纠结了
直接上物理机+nvme ,性能直接翻 N 倍
sujin190
285 天前
@drymonfidelia 那给 mysql 分了多少?理论上 innodb buffer 给超过 16g 了吧,btree 索引覆盖的情况下应该性能可以的吧
rs9G7IrdOdiNR3h1
285 天前
如果只是需要最新的一条 type ,为什么不考虑缓存最新的一条呢?
iseki
285 天前
你试试相同条件执行两次,是不是第二次就很快🤣
wakaka
285 天前
着急的话先升级硬件,加内存,换更快的 SSD 。然后再考虑其他的。
hefish
285 天前
也许可以删掉点数据,剩下 10000000 条,那应该就快了。
drymonfidelia
285 天前
@whooami 因为每次的 query 都不一样,查完一次可能几年后才会再查相同条件
@iseki 没有变快多少
@hefish 一条都不能删
EminemW
285 天前
是不是 in 这个条件导致的,改成 union 试试。另外看看索引有没有用对,强制指定索引,看哪个索引比较快
drymonfidelia
285 天前
@EminemW 昨天试过了改成=都不行
lujiaxing
285 天前
首先你需要看下数据库物理文件是存放在什么地方的. 是不是 NVME 盘.
其次看下设置中 INNODB_BUFFER 设置的多少. 越多越好.
还有发一下 mysql 版本.

个人认为, MYSQL 的能力并不足以支撑单表 2GB 的数据量. 如果你确实有如此巨大规模的数据量, 建议换 MSSQLServer 或者 Oracle. 别想着什么加什么 ClickHouse, Doris...

相比招一些一年要付 20W 年薪的开发比, 买一个数据库产品授权成本并不算高.
lujiaxing
285 天前
innodb_buffer_pool
msg7086
284 天前
试试把 data 字段拆出去呢?
zw5473547
284 天前
已经用上 SSD 的话,就采用分表和主从库分开,索引再优化优化。十几年前 discuz 的 posts 表 3.2 亿条数据这么处理都大负载下没问题的。
igeeky
284 天前
可以试试联合索引(query, type) 并且使用 hash 索引.
hash 索引不支持范围查询, 但是索引体积更小, 并且查询效率也更高.

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

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

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

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

© 2021 V2EX