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

Bri*_*itz 11 mysql sql database xampp mediawiki

要旨

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

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

我特别想要做什么(准备进口):

步骤1,2,3:此图像描述了我通过单击"更改"并取消选中"自动增量"(准备导入)修改字段page_id之前的表格页面.我对表修订中的字段rev_id和表格文本中的old_id执行了完全相同的修改,但省略了屏幕截图以避免冗余.

修改'page_id'之前的表'page'

第4步:此图像描述了在删除所有表之前表的索引.

表格'page'的索引在删除之前

步骤5:此图像描述了在删除所有表之前表修订的索引.

在删除之前,表'revision'的索引

第6步:此图像描述了在删除所有表之前表格文本的索引.

在删除之前,表'text'的索引

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

我只需要恢复原始索引和自动增加字段而无需等待一百年.

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

sac*_*ine 4

我真的很喜欢维基百科,所以我会尽力提供帮助。

你需要使用很多

ALTER TABLE
Run Code Online (Sandbox Code Playgroud)

添加主键

ALTER TABLE page ADD PRIMARY KEY (page_id);
ALTER TABLE revision ADD PRIMARY KEY (rev_id);
ALTER TABLE text ADD PRIMARY KEY (old_id);
Run Code Online (Sandbox Code Playgroud)

重新添加自动增量

ALTER TABLE page MODIFY COLUMN page_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT;
Run Code Online (Sandbox Code Playgroud)

在继续之前,我需要所有表的表描述。如果 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;
Run Code Online (Sandbox Code Playgroud)

添加唯一键

ALTER TABLE page ADD UNIQUE name_title(page_namespace, page_title);
ALTER TABLE revision ADD UNIQUE rev_page_id(rev_page, rev_id);
Run Code Online (Sandbox Code Playgroud)

其他指标

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);
Run Code Online (Sandbox Code Playgroud)

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

  • @BrianSchmitz 是的,做了一些更改,现在一切都应该可以正常工作。以后,使用“SHOW CREATE TABLE table_name”代替 phpmyadmin 的屏幕截图。 (2认同)