MySQL:在巨大的插入后添加索引 ->更快与否

标签 mysql query-optimization

我最近与一位同事讨论了以下场景:

(MySQL 5.x,InnoDB,单事务)

  • 表 A 20 mio 条目
  • 表 B 为空(上面有几个索引)

查询:INSERT INTO B AS SELECT some_fields FROM A WHERE date < XY -- selects about 3/4, or 15 MIO elements

现在回答我们的问题:

  • 主要问题:首先停用/删除表 B 中的所有索引然后再读取它们会更快吗,还是都一样?
  • 奖励问题 I:还有其他改进此类查询的想法吗?恕我直言,这需要很长时间。
  • 奖励问题 II:该磁盘上的写入缓存已停用,这是否会产生重大影响(比平时更多)。

感谢您的帮助!

最佳答案

你肯定想做

ALTER TABLE B DISABLE KEYS

在运行插入之前。否则 MySQL 会尝试在每次插入后进行计算。插入所有内容后:

ALTER TABLE B ENABLE KEYS

一旦你这样做了,MySQL 将立即重新计算它们。这仍然需要一些时间,但比每次插入都要少得多。

改进:检查表 A 上的日期列是否已编入索引。如果不是,则可能是您的选择花费了很长时间。

老实说,我不确定写缓存问题

关于MySQL:在巨大的插入后添加索引 ->更快与否,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5378866/

相关文章:

postgresql - 为什么 Postgres 使用 "Index Scan Backward"来获取最大 ID?

java - 如何在 Java 中将日期插入 MySQL 数据库表?

mysql - 将 2 个 mysql 查询合并到一个具有唯一行的表中

php - 防止页面刷新时mysql查询

sql - 有没有办法在 MySQL 中选择最大行 id,而无需使用 MAX() 扫描所有行?

mysql - 优化 MySQL 表以加快选择操作

php - 日期过滤器查询不起作用

MySQL left join with '-' character in a column

sql-server - 如何使用 SQL 查询降低聚集索引扫描成本

mysql - 优化nodejs mysql插入