有效地重新索引庞大的数据库(英语维基百科)

时间:2012-06-06 21:11:14

标签: mysql sql database xampp mediawiki

THE GIST

在执行大量40 GB以上的英语维基百科导入之前,我不得不暂时删除三个表('page','revision'和'text')中的索引和自动增量字段来处理负载。现在我终于成功地将英语维基百科导入我的本地机器并创建了一个本地镜像(MediaWiki API)。耶!

但是,我现在需要在不到十年的时间内重新创建索引和自动增量字段。幸运的是,(1)在删除索引和字段之前,我在phpmyadmin中拍摄了相关表格的大量屏幕截图; (2)我可以极其精确地解释我在导入之前采取的步骤; (3)对于任何流利MySQL的人来说,这都不应该太困难。不幸的是,我没有MySQL的专业知识,因此“婴儿步骤”的解释将非常有用。

我真正想要做什么(准备进口):

步骤1,2,3:在我通过点击“更改”并取消选中“自动增量”修改字段 page_id 之前,此图像描绘了表格页面 (准备进口)。我对表修订中的字段 rev_id 执行了相同的修改,并在表文字中对 old_id 执行了相同的修改,但省略了屏幕 - 以避免冗余。

table 'page' before modification of 'page_id'

步骤4:此图像描述了表格页面的索引,然后我删除了所有这些索引。

indexes for table 'page' before I dropped them

步骤5:此图像描述了表格版本的索引,然后我删除了所有这些索引。

indexes for table 'revision' before I dropped them

步骤6:此图像描述了我删除所有表之前文本表的索引。

indexes for table 'text' before I dropped them

我现在需要什么(在进口后恢复):

我只需要在不等一百年的情况下恢复原始索引和自动增加字段。

设置细节:PHP 5.3.8(apache2handler),MySQL 5.5.16(InnoDB),Apache 2.2.21,Ubuntu 12.04 LTS,MediaWiki 1.19.0(私有wiki)

1 个答案:

答案 0 :(得分:4)

我非常喜欢维基百科,所以我会尽力帮助。

你需要使用很多

ALTER TABLE

添加主键

ALTER TABLE page ADD PRIMARY KEY (page_id);
ALTER TABLE revision ADD PRIMARY KEY (rev_id);
ALTER TABLE text ADD PRIMARY KEY (old_id);

添加自动增量

ALTER TABLE page MODIFY COLUMN page_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT;

在继续之前,我需要所有表的表描述。如果rev_id和old_id与page_id的定义相同,则:

ALTER TABLE revision MODIFY COLUMN rev_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT;
ALTER TABLE text MODIFY COLUMN old_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT;

添加唯一键

ALTER TABLE page ADD UNIQUE name_title(page_namespace, page_title);
ALTER TABLE revision ADD UNIQUE rev_page_id(rev_page, rev_id);

其他指数

ALTER TABLE page ADD INDEX page_random(page_random);
ALTER TABLE page ADD INDEX page_len(page_len);
ALTER TABLE page ADD INDEX page_redirect_namespace(page_is_redirect, page_namespace, page_len);
ALTER TABLE revision ADD INDEX rev_timestamp(rev_timestamp);
ALTER TABLE revision ADD INDEX page_timestamp(rev_page, rev_timestamp);
ALTER TABLE revision ADD INDEX user_timestamp(rev_user, rev_timestamp);
ALTER TABLE revision ADD INDEX user_text_timestamp(rev_user_text, rev_timestamp);

同样,可能存在更改此内容的列定义。您需要提供CREATE TABLE信息。