MySQL:InnoDB 表上的每个索引的创建时间都比上一个索引长

发布于 2024-11-19 20:20:15 字数 1221 浏览 2 评论 0原文

我有一个 MySQL 表,如下所示:

CREATE TABLE my_facts (
  `id` int(11) DEFAULT NULL auto_increment PRIMARY KEY, 
  `account_id` int(11) NOT NULL, 
  `asked_on` date NOT NULL, 
  `foo_id` int(11) NOT NULL, 
  `bar_id` int(11) NOT NULL, 
  `baz_id` int(11) NOT NULL, 
  `corge_id` int(11) NOT NULL, 
  `grault_id` int(11) NOT NULL, 
  `flob_id` int(11) NOT NULL, 
  `tag_id` int(11) NOT NULL) 
ENGINE=InnoDB;

有 450k 行。但是:我想向其中添加几个索引:

CREATE INDEX `k_account_foo_id` ON `my_facts` (`account_id`, `asked_on`, `foo_id`, `tag_id`);

CREATE INDEX `k_account_bar_id` ON `my_facts` (`account_id`, `asked_on`, `bar_id`, `tag_id`);

CREATE INDEX `k_account_baz_id` ON `my_facts` (`account_id`, `asked_on`, `baz_id`, `tag_id`);

CREATE INDEX `k_account_corge_id` ON `my_facts` (`account_id`, `asked_on`, `corge_id`, `tag_id`);

CREATE INDEX `k_account_grault_id` ON `my_facts` (`account_id`, `asked_on`, `grault_id`, `tag_id`);

我的问题是每个索引的创建时间都比上一个要长——而且它似乎处于几何轨迹上。按顺序,创建索引需要 11.6 秒、28.8 秒、44.4 秒、76 秒和 128 秒。我想添加更多索引。

当我将表创建为 MyISAM 时,不仅整个过程要快得多,而且创建每个后续索引的时间可能比前一个索引长一秒。

什么给?这种行为是预期的吗?我在创建索引时做了一些有趣的事情吗?

无论如何,我在本次测试中使用的是 MySQL 5.1.48/OS X 10.6.8。

I've got a MySQL table that looks like this:

CREATE TABLE my_facts (
  `id` int(11) DEFAULT NULL auto_increment PRIMARY KEY, 
  `account_id` int(11) NOT NULL, 
  `asked_on` date NOT NULL, 
  `foo_id` int(11) NOT NULL, 
  `bar_id` int(11) NOT NULL, 
  `baz_id` int(11) NOT NULL, 
  `corge_id` int(11) NOT NULL, 
  `grault_id` int(11) NOT NULL, 
  `flob_id` int(11) NOT NULL, 
  `tag_id` int(11) NOT NULL) 
ENGINE=InnoDB;

and has 450k rows. But: I want to add several indexes to it:

CREATE INDEX `k_account_foo_id` ON `my_facts` (`account_id`, `asked_on`, `foo_id`, `tag_id`);

CREATE INDEX `k_account_bar_id` ON `my_facts` (`account_id`, `asked_on`, `bar_id`, `tag_id`);

CREATE INDEX `k_account_baz_id` ON `my_facts` (`account_id`, `asked_on`, `baz_id`, `tag_id`);

CREATE INDEX `k_account_corge_id` ON `my_facts` (`account_id`, `asked_on`, `corge_id`, `tag_id`);

CREATE INDEX `k_account_grault_id` ON `my_facts` (`account_id`, `asked_on`, `grault_id`, `tag_id`);

My problem is that each index takes longer to create than the last -- and it seems to be on a geometric trajectory. In order, the indexes take 11.6s, 28.8s, 44.4s, 76s, and 128s to create. And I'd like to add a few more indexes.

When I create the table as MyISAM, not only is the whole process a whole lot faster, creating each subsequent index takes maybe a second longer than the previous index.

What gives? Is this behavior expected? Am I doing something funny in my index creation?

For what it's worth, I'm using MySQL 5.1.48/OS X 10.6.8 in this test.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

迷迭香的记忆 2024-11-26 20:20:15

这是基于 索引创建方式的预期行为发生在 InnoDB 中。

在 MySQL 5.0 版本之前,添加或删除表上的索引
如果表有很多行,则处理现有数据可能会非常慢。这
CREATE INDEX 和 DROP INDEX 命令通过创建一个新的空索引来工作
使用请求的索引集定义的表。然后它复制
将现有行逐一添加到新表中,同时更新索引
去。以这种方式将条目插入索引,其中
键值未排序,需要随机访问索引节点,
并且远非最佳。原始表中的所有行都被删除后
复制,旧表被删除,副本被重命名为名称
原始表。

从版本 5.1 开始,MySQL 允许存储引擎创建或删除索引,而无需复制整个表的内容。然而,MySQL 5.1 版中标准内置的 InnoDB 并没有利用此功能。

This is expected behavior based on how index creation happens in InnoDB.

In MySQL versions up to 5.0, adding or dropping an index on a table
with existing data can be very slow if the table has many rows. The
CREATE INDEX and DROP INDEX commands work by creating a new, empty
table defined with the requested set of indexes. It then copies the
existing rows to the new table one-by-one, updating the indexes as it
goes. Inserting entries into the indexes in this fashion, where the
key values are not sorted, requires random access to the index nodes,
and is far from optimal. After all rows from the original table are
copied, the old table is dropped and the copy is renamed with the name
of the original table.

Beginning with version 5.1, MySQL allows a storage engine to create or drop indexes without copying the contents of the entire table. The standard built-in InnoDB in MySQL version 5.1, however, does not take advantage of this capability.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文