【问题标题】:How long should it take to build an index using ALTER TABLE in MySQL?在 MySQL 中使用 ALTER TABLE 构建索引需要多长时间?
【发布时间】:2010-02-15 17:41:32
【问题描述】:

这可能有点像询问字符串的长度,但统计数据是:

  • 英特尔双核 4GB RAM
  • 包含 800 万行、约 20 列的表,主要是带有 auto_increment 主 ID 的 varchars
  • 查询是:ALTER TABLE my_table ADD INDEX my_index (my_column);
  • my_column 是 varchar(200)
  • 存储是 MyISAM

数量级,应该是1分钟、10分钟、100分钟?

谢谢

编辑:好吧,它花了 2 小时 37 分钟,而在配置基本相同的较小规格机器上则需要 0 小时 33 分钟。我不知道为什么花了这么长时间。唯一的可能是 prod 机器 HD 已满 85%,还有 100GB 可用空间。应该足够了,但我想这取决于可用空间的分配方式。

【问题讨论】:

  • 测试环境需要多长时间?服务器负载将是您唯一无法解决的问题,但我看不出它需要超过一分钟。
  • 我现在只是在开发环境中运行。我预计大约 5 分钟。 30 分钟后,还没有做任何事情。此外,在顶部,mysqld 似乎非常不活跃,而在 dev 中,我看到 60% 以上的 cpu
  • 检查磁盘空间是否已用完,尤其是在 mysql 临时目录中。

标签: mysql indexing


【解决方案1】:

如果您只是添加单个索引,则大约需要 10 分钟。但是,如果内存中没有该索引文件,则需要 100 分钟或更长时间。

包含 800 万行的 200 个 varchar 最多需要 1.6GB,但加上所有索引开销,大约需要 2-3 GB。但如果大多数行少于 200 个字符,则需要的时间会更少。 (您可能需要选择 sum(length(my_column)) 以查看需要多少空间。)

您想编辑您的/etc/mysql/my.cnf 文件。使用这些设置;

myisam_sort_buffer_size = 100M
sort_buffer_size = 100M

祝你好运。

【讨论】:

  • 嗨,谢谢。我之前用大约 4 毫米的行做过这个,它完成得非常快,所以是的,用 8 毫米可能我可能已经将索引推到了磁盘上。
【解决方案2】:

在我的测试MusicBrainz 数据库中,表track25 分钟内构建了一个PRIMARY KEY 和三个二级索引:

CREATE TABLE `track` (
  `id` int(11) NOT NULL,
  `artist` int(11) NOT NULL,
  `name` varchar(255) NOT NULL,
  `gid` char(36) NOT NULL,
  `length` int(11) DEFAULT '0',
  `year` int(11) DEFAULT '0',
  `modpending` int(11) DEFAULT '0',
  PRIMARY KEY (`id`),
  KEY `gid` (`gid`),
  KEY `artist` (`artist`),
  KEY `name` (`name`)
) DEFAULT CHARSET=utf8

该表有9001870 记录。

机器是Intel(R) Core(TM)2 CPU 6400 @ 2.13GHz2Gb RAMFedora Core 12MySQL 5.1.42

@@myisam_sort_buffer_size256M

【讨论】:

  • 嗯,我的 my.cnf 中似乎没有指定 myisam_sort_buffer_size 或 sort_buffer_size...
  • 好的,所以它在我的测试环境中完成,它的规格较低(3gb,cpu 稍慢)在 33 分钟内完成。产品仍在搅动。我希望有状态更新之类的......
  • @Richard:如果未指定,则使用默认值 (8M)。您可以通过发出SELECT @@myisam_sort_buffer_size 来检查它。这个值太低了,你应该增加它(特别是如果你有3 GbRAM)。此内存仅在创建或修复索引时使用(和分配),因此可以增加它。 @@sort_buffer_size 不影响索引创建速度,只影响查询。
【解决方案3】:

此外,如果您需要构建多个索引,最好在一次调用中创建所有索引,而不是单独创建...原因:它基本上是重写所有索引页面以包含您的新索引与其他任何内容它有过。我发现过去有一个 2+ gig 表,需要在其上构建大约 15 个索引。在每个索引之间单独构建所有内容都会在时间上保持增量增长。然后一次尝试所有索引大约需要 3 个多一点,因为它为每条记录构建所有索引并一次写入所有索引,而不必不断重建页面。

【讨论】:

    猜你喜欢
    • 2011-01-29
    • 2011-11-27
    • 1970-01-01
    • 2016-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多