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)
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 放在更快的磁盘上。