代码之家  ›  专栏  ›  技术社区  ›  Richard H

在mysql中使用alter table构建索引需要多长时间?

  •  7
  • Richard H  · 技术社区  · 15 年前

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

    • Intel双核4GB RAM
    • 表中有800万行,约20列,大多数是带有自动递增主ID的varchar
    • 查询是:更改表我的表添加索引 my_index (My-列);
    • 我的专栏是varchar(200)
    • 存储是myisam

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

    谢谢

    编辑: 好吧,它花了2小时37分钟,相比之下,在一个小规格的机器上花了0小时33分钟,设置基本相同。我不知道为什么要花这么长时间。唯一的可能性是Prod Machine HD为85%满,100GB可用。应该足够了,但我想这取决于自由空间是如何分布的。

    3 回复  |  直到 15 年前
        1
  •  5
  •   vy32    15 年前

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

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

    您要编辑 /etc/mysql/my.cnf 文件。使用这些设置进行播放;

    myisam_sort_buffer_size = 100M
    sort_buffer_size = 100M
    

    祝你好运。

        2
  •  1
  •   DRapp    15 年前

    此外,如果需要构建多个索引,最好在一个调用中创建所有索引,而不是单独创建索引…原因:它基本上类似于重写所有的索引页,以包含新的索引以及它拥有的其他内容。我以前发现有一个2+gig表,需要在上面构建大约15个索引。在每个索引之间,构建所有单独的索引都会在时间上不断增加。然后一次尝试所有的索引比3个单独的索引多一点,因为它构建了每个记录的所有索引,并且一次写了所有的索引,而不必一直重建页面。

        3
  •  0
  •   Quassnoi    15 年前

    在我的测试中 MusicBrainz 数据库表 track 建立一个 PRIMARY KEY 三个二级指标 25 分钟:

    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.13GHz 具有 2Gb RAM , Fedora Core 12 , MySQL 5.1.42 .

    @@myisam_sort_buffer_size 256M .