我最近与一位同事讨论了以下场景:
(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/