【问题标题】:Index Creation after Load Data InFile加载数据 InFile 后创建索引
【发布时间】:2017-12-02 04:30:33
【问题描述】:

我正在使用 MySQL v5.6。

我在一个新创建的表 (InnoDB) 中插入了大约 1000 万行。我尝试在“Load Data InFile”和多次插入之间选择最佳方式。

Load Data InFile 应该(并且现在)更有效,但我发现一个奇怪的事情:使用“load data infile”时索引创建时间更长(增加了 15%)...

观察的步骤(每一步都在前一步完成后开始):

  1. 我创建了一个新表 (table_1)
  2. 我创建了一个新表 (table_2)
  3. 我在 table_1 中插入了 1000 万行,并进行了多次插入(5000 批)
  4. 我在 table_2 中插入 1000 万行并在文件中加载数据
  5. 我在 table_1 上一次创建 4 个索引(使用 alter Table)
  6. 我在 table_2 上一次创建 4 个索引(使用 alter Table) -> 比上一步长约 15%

这能解释什么?

(当然,按照2、1、4、3、6、5的顺序,结果是一样的。)

【问题讨论】:

  • 好。您通过更改步骤顺序等消除了几个变量。更多问题:记录的顺序是否相同? PRIMARY KEY 是否已经建立? AUTO_INCREMENT 还是自然的?如果是自然的,记录是否按此顺序排列?一个带有 4 个 ADD INDEX 子句的 ALTER?

标签: mysql indexing bulkinsert


【解决方案1】:

使用 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 替换为您在其中创建这些表的数据库的名称。)

【讨论】:

  • 这可能就是原因!然而,INFORMATION_SCHEMA 中似乎不存在 INNODB_BUFFER_POOL。你拼错了吗?参考这里:dev.mysql.com/doc/refman/5.7/en/innodb-i_s-tables.html
  • 对不起!是的,我拼错了。这真的是 INNODB_BUFFER_PAGE。我将编辑上述内容以更正此问题。
  • 欲了解更多信息,请尝试SELECT count(*), sum(number_records) as rows, sum(data_size), min(data_size), round(avg(data_size)) as avg, max(data_size), index_name FROM ... GROUP BY index_name;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-28
  • 2015-06-21
  • 1970-01-01
  • 1970-01-01
  • 2013-01-09
  • 2010-10-22
相关资源
最近更新 更多