创建索引需要很长时间

sen*_*bot 12 mysql innodb

大约2个月前,我将EnWikipedia数据(http://dumps.wikimedia.org/enwiki/20120211/)导入mysql.

完成导入EnWikipedia数据后,我一直在mysql的EnWikipedia数据库表中创建索引大约2个月.

现在,我已经达到了在"pagelinks"中创建索引的程度.

但是,通过这一点似乎需要无限的时间.

因此,我检查了剩余的时间,以确保我的直觉是正确的.

因此,预计剩余时间为60天(假设我从头开始再次在"pagelinks"中创建索引.)

My EnWikipedia database has 7 tables: 
"categorylinks"(records: 60 mil, size: 23.5 GiB), 
"langlinks"(records: 15 mil, size: 1.5 GiB), 
"page"(records: 26 mil, size 4.9 GiB), 
"pagelinks"(records: 630 mil, size: 56.4 GiB), 
"redirect"(records: 6 mil, size: 327.8 MiB), 
"revision"(records: 26 mil, size: 4.6 GiB) and "text"(records: 26 mil, size: 60.8 GiB).
Run Code Online (Sandbox Code Playgroud)

我的服务器是...... Linux版本2.6.32-5-amd64(Debian 2.6.32-39),内存16GB,2.39Ghz Intel 4核心

创造指数需要这么长时间的常见现象吗?有没有人有更好的解决方案来更快地创建索引?

提前致谢 !


PS:我做了以下操作来检查剩余时间.

参考文献(对不起,以下页面用日文写成):http://d.hatena.ne.jp/sh2/20110615

1.我在"pagelink"中有记录.

 mysql> select count(*) from pagelinks;
 +-----------+ 
 | count(*)  |
 +-----------+ 
 | 632047759 |
 +-----------+ 
 1 row in set (1 hour 25 min 26.18 sec)
Run Code Online (Sandbox Code Playgroud)

第2位.我得到了每分钟增加的记录数量.

getHandler_write.sh

 #!/bin/bash

 while true
 do
   cat <<_EOF_
 SHOW GLOBAL STATUS LIKE 'Handler_write';
 _EOF_
   sleep 60
 done | mysql -u root -p -N
Run Code Online (Sandbox Code Playgroud)

命令

$ sh getHandler_write.sh
 Enter password:
 Handler_write   1289808074
 Handler_write   1289814597
 Handler_write   1289822748
 Handler_write   1289829789
 Handler_write   1289836322
 Handler_write   1289844916
 Handler_write   1289852226
Run Code Online (Sandbox Code Playgroud)

3.我计算了录音的速度.

根据2.的结果,记录的速度是

 7233 records/minutes
Run Code Online (Sandbox Code Playgroud)

4.然后剩下的时间是

 (632047759/7233)/60/24 = 60 days
Run Code Online (Sandbox Code Playgroud)

Tim*_*Tim 7

那些是非常大的表,所以我希望索引很慢.6.3亿条记录是很多要索引的数据.要看的一件事是分区,数据集很大,没有正确分区的表,性能会很慢.这里有一些有用的链接: 在慢速索引上使用分区,你也可以尝试查看用于构建索引的缓冲区大小设置(默认值为8MB,对于你的大型表来说,这将会减慢你的速度.缓冲区大小文档