Mysql 8.0 问题 查询结果快,但插入慢

Mysql 8.0 problem Quick query results, but slow insertion

提问人:Ning 提问时间:11/8/2023 最后编辑:Ning 更新时间:11/15/2023 访问量:71

问:

我从一个20GB的数据表A查询,查询结果是40000行数据。我的查询是“从 A 中选择不同的客户,其中”2022-01-01“介于 col1 和 col2 之间。由于 col1 和 col2 已建立索引,因此我可以在短短 3 秒内获取所有 40,000 行数据。但是,当我想将此结果插入表 B 时,查询变成了“插入表 B 从 A 中选择不同的客户,其中 '2022-01-01' 介于 col1 和 col2 之间”,花了 5 分钟。这是什么原因?

5 分钟是一次全表扫描所需的时间。

当我添加“插入”操作时,SELECT 语句的“EXPLAIN”结果中的“type”从“range”更改为“ALL”。

mysql sql-insert

评论

0赞 Akina 11/8/2023
这是什么原因?尝试从这个诱惑器中删除所有索引并测试...
0赞 P.Salmon 11/8/2023
我猜 20G 是 20 GB,但 4W 是什么?此外,请将查询作为文本与表定义一起发布。
0赞 Ning 11/8/2023
我创建了只有一列的新表,没有索引,仍然花了我 5 分钟。对不起,它是 40k,而不是 4W。
0赞 Bagus Tesa 11/8/2023
“在它前面添加'INSERT TABLE B'之后,” - 我确实想知道查询是什么样的,它是一个过程吗?你有触发器吗?还是添加索引后变慢?磁盘使用率如何,是否已达到最大值?insert
0赞 Ning 11/8/2023
我的查询是“插入表 B 从 A 中选择不同的客户,其中 col1 和 col2 之间的”2022-01-01“”。没有“插入表B”,速度很快。但是选择结果只有 40k 个数据,所以我认为可能需要几秒钟而不是 5 分钟。

答:

0赞 Ning 11/15/2023 #1

MySQL优化器认为,在插入过程中使用索引可能会降低效率,因此,它默认为全表扫描。但是,当我使用 FORCE INDEX 时,插入速度显着提高,并且不再执行全表扫描。建议在适当的时间强制使用索引,而不是让优化程序决定查询计划。