如何使 InnoDB 表中的 CREATE INDEX 更快

use*_*196 5 mysql innodb index

我有 RHEL 5 平台和 8G RAM 和 MySQL 版本 14.12 distrib 5.0.86。我想在一个 InnoDB 表中创建索引,但是需要很长时间:

Time | State             | Info
2291 | copy to tmp table | create index index_test
Run Code Online (Sandbox Code Playgroud)

该表有 8,000,000 行,在 /etc/my.cnf

innodb_buffer_pool_size = 4G
Run Code Online (Sandbox Code Playgroud)

但还是太慢了。

如何使 innodb 表中的创建索引更快?


我已经有了这些变量:

read_buffer_size = 2M
sort_buffer_size = 8M
tmp_table_size   = 64M
Run Code Online (Sandbox Code Playgroud)

显示创建 user_t\G

CREATE TABLE `user_t` (
  `t_id` mediumint(8) unsigned NOT NULL auto_increment,
  `user_id` varchar(50) NOT NULL default '',
  `event_time` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
  `user_A` double(11,2) NOT NULL,
  `txt1` varchar(150) default NULL,
  `txt2` varchar(250) default NULL,
  `txt3` varchar(250) default NULL,
  `txt4` varchar(250) default NULL,
  `txt5` varchar(250) default NULL,
  `inv_id` varchar(100) NOT NULL default '',
  `display_text` varchar(250) default NULL,
  `ip` varchar(15) default NULL,
  `testID` varchar(150) NOT NULL default '',
  `bad_t` enum('0','1') default '0',
  `t_id_m` mediumint(11) unsigned default NULL,
  `status` enum('open','pending','processed') NOT NULL default 'processed',
  `b` double(11,2) default NULL,
  `system_id` varchar(50) default NULL,
  `isfixed` int(1) default '0',
  `tmptxt1` varchar(150) default NULL,
  PRIMARY KEY  (`t_id`),
  KEY `undex1` (`testID`,`event_time`,`txt1`),
  KEY `index2` (`t_id_m`)
) ENGINE=InnoDB AUTO_INCREMENT=10260505 DEFAULT CHARSET=utf8
Run Code Online (Sandbox Code Playgroud)

以及以下需要很长时间的创建索引命令:

create index index_test on user_t (event_time);
Run Code Online (Sandbox Code Playgroud)

Cra*_*ein 4

RHEL5 附带 MySQL 5.0,除非您安装了其他东西。所以我会专注于增加这三个变量。它们并不特定于 InnoDB 或 MyISAM。

read_buffer_size        = #of Mb
sort_buffer_size        = #of Mb
tmp_table_size          = #of Mb
Run Code Online (Sandbox Code Playgroud)

http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html#sysvar_read_buffer_size

http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html#sysvar_sort_buffer_size

http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html#sysvar_tmp_table_size

例子 :

read_buffer_size        = 16M
sort_buffer_size        = 64M
tmp_table_size          = 256M
Run Code Online (Sandbox Code Playgroud)

增加 buffer_pool 不会帮助您加快索引创建速度。它用于缓存。

http://dev.mysql.com/doc/refman/5.0/en/innodb-buffer-pool.html

另外,如果可能的话,我也会尝试将 tmpdir 放在更快的磁盘上。