加载数据InFile后的索引创建

时间:2017-06-28 17:08:50

标签: mysql indexing bulkinsert

我正在使用MySQL v5.6。

我在新创建的表(InnoDB)中插入大约1000万行。我尝试在“加载数据InFile”和多个插入之间选择最佳方法。

加载数据InFile应该(并且更高效),但我观察到一个奇怪的事情:使用“加载数据infile”时索引创建要长得多(15%)......

步骤观察(每个步骤在前一个步骤完成时开始):

  1. 我创建了一个新表(table_1)
  2. 我创建了一个新表(table_2)
  3. 我在table_1中插入了数千万行,其中有多个插入(批量为5000)
  4. 我在table_2中插入了1000万行,其中包含负载数据
  5. 我在table_1
  6. 上一次创建4个索引(使用alter table)
  7. 我在table_2上创建了4个索引(使用alter table) - >比上一步长约15%
  8. 有什么可以解释的?

    (当然,结果与订购的步骤2,1,4,3,6,5相同。)

1 个答案:

答案 0 :(得分:0)

使用INSERT加载数据可能会导致更多数据页面占用缓冲池。在使用LOAD DATA的表上创建索引时,它首先必须将页面从磁盘加载到缓冲池中,然后将数据索引到其中。

您可以在加载数据后通过查询来测试:

SELECT table_name, index_name, COUNT(*)
FROM INFORMATION_SCHEMA.INNODB_BUFFER_PAGE
WHERE table_name IN ('`mydatabase`.`table_1`', '`mydatabase`.`table_2`')
GROUP BY table_name, index_name;

然后在构建索引后再次执行此操作。

(当然用你在这些表中创建的数据库的名称替换mydatabase。)