11

要旨

在对英语 Wikipedia 执行 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 步:此图描绘了在我删除所有索引之前表页的索引。

在我删除它们之前表“页面”的索引

第 5 步:此图描述了在我删除所有索引之前表修订的索引。

在我删除它们之前表“修订”的索引

第 6 步:这张图片描述了我删除所有表格文本之前的索引。

删除表“文本”之前的索引

我现在需要什么(导入后恢复):

我只需要恢复原始索引和自增字段,无需等待一百年。

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

4

1 回答 1

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 信息。

于 2012-06-06T22:13:36.953 回答