From: Yuri Astrakhan Date: Sat, 11 Nov 2006 21:38:18 +0000 (+0000) Subject: bugfix 6440: updated indexes to improve backlinking queries. May be very slow on... X-Git-Tag: 1.31.0-rc.0~55222 X-Git-Url: http://git.cyclocoop.org/%22.%24redirect_annul.%22?a=commitdiff_plain;h=4e6fbd33bc3cec6d7237aa269ff1e1b6623d4825;p=lhc%2Fweb%2Fwiklou.git bugfix 6440: updated indexes to improve backlinking queries. May be very slow on large wikis. --- diff --git a/RELEASE-NOTES b/RELEASE-NOTES index 510f8254c3..d7f9316b18 100644 --- a/RELEASE-NOTES +++ b/RELEASE-NOTES @@ -176,7 +176,7 @@ it from source control: http://www.mediawiki.org/wiki/Download_from_SVN * Do a check for the PHP 5.0.x 64-bit bug, since this is much more disruptive as of MW 1.8 than it used to be. Install or upgrade now aborts with a warning and a request to upgrade. - +* (bug 6440) Updated indexes to improve backlinking queries (links, templates, images) == Languages updated == diff --git a/maintenance/archives/patch-backlinkindexes.sql b/maintenance/archives/patch-backlinkindexes.sql new file mode 100644 index 0000000000..5facd9ea1b --- /dev/null +++ b/maintenance/archives/patch-backlinkindexes.sql @@ -0,0 +1,19 @@ +-- +-- patch-backlinkindexes.sql +-- +-- Per bug 6440 / http://bugzilla.wikimedia.org/show_bug.cgi?id=6440 +-- +-- Improve performance of the "what links here"-type queries +-- + +ALTER TABLE /*$wgDBprefix*/pagelinks + DROP INDEX pl_namespace, + ADD INDEX pl_namespace(pl_namespace, pl_title, pl_from); + +ALTER TABLE /*$wgDBprefix*/templatelinks + DROP INDEX tl_namespace, + ADD INDEX tl_namespace(tl_namespace, tl_title, tl_from); + +ALTER TABLE /*$wgDBprefix*/imagelinks + DROP INDEX il_to, + ADD INDEX il_to(il_to, il_from); diff --git a/maintenance/mysql5/tables.sql b/maintenance/mysql5/tables.sql index 1e63b91d41..ed8c68465c 100644 --- a/maintenance/mysql5/tables.sql +++ b/maintenance/mysql5/tables.sql @@ -383,7 +383,7 @@ CREATE TABLE /*$wgDBprefix*/pagelinks ( pl_title varchar(255) binary NOT NULL default '', UNIQUE KEY pl_from (pl_from,pl_namespace,pl_title), - KEY (pl_namespace,pl_title) + KEY (pl_namespace,pl_title,pl_from) ) ENGINE=InnoDB, DEFAULT CHARSET=utf8; @@ -403,7 +403,7 @@ CREATE TABLE /*$wgDBprefix*/templatelinks ( tl_title varchar(255) binary NOT NULL default '', UNIQUE KEY tl_from (tl_from,tl_namespace,tl_title), - KEY (tl_namespace,tl_title) + KEY (tl_namespace,tl_title,tl_from) ) ENGINE=InnoDB, DEFAULT CHARSET=utf8; @@ -423,7 +423,7 @@ CREATE TABLE /*$wgDBprefix*/imagelinks ( il_to varchar(255) binary NOT NULL default '', UNIQUE KEY il_from (il_from,il_to), - KEY (il_to) + KEY (il_to,il_from) ) ENGINE=InnoDB, DEFAULT CHARSET=utf8; diff --git a/maintenance/oracle/tables.sql b/maintenance/oracle/tables.sql index 6733f95074..7b24d1ee08 100644 --- a/maintenance/oracle/tables.sql +++ b/maintenance/oracle/tables.sql @@ -109,14 +109,14 @@ CREATE TABLE pagelinks ( pl_title VARCHAR2(255) NOT NULL ); CREATE UNIQUE INDEX pl_from ON pagelinks(pl_from, pl_namespace, pl_title); -CREATE INDEX pl_namespace ON pagelinks(pl_namespace, pl_title); +CREATE INDEX pl_namespace ON pagelinks(pl_namespace, pl_title, pl_from); CREATE TABLE imagelinks ( il_from NUMBER(8) NOT NULL REFERENCES page(page_id) ON DELETE CASCADE, il_to VARCHAR2(255) NOT NULL ); CREATE UNIQUE INDEX il_from ON imagelinks(il_from, il_to); -CREATE INDEX il_to ON imagelinks(il_to); +CREATE INDEX il_to ON imagelinks(il_to, il_from); CREATE TABLE categorylinks ( cl_from NUMBER(8) NOT NULL REFERENCES page(page_id) ON DELETE CASCADE, diff --git a/maintenance/tables.sql b/maintenance/tables.sql index e68c9b072c..d210179657 100644 --- a/maintenance/tables.sql +++ b/maintenance/tables.sql @@ -371,7 +371,7 @@ CREATE TABLE /*$wgDBprefix*/pagelinks ( pl_title varchar(255) binary NOT NULL default '', UNIQUE KEY pl_from (pl_from,pl_namespace,pl_title), - KEY (pl_namespace,pl_title) + KEY (pl_namespace,pl_title,pl_from) ) TYPE=InnoDB; @@ -391,7 +391,7 @@ CREATE TABLE /*$wgDBprefix*/templatelinks ( tl_title varchar(255) binary NOT NULL default '', UNIQUE KEY tl_from (tl_from,tl_namespace,tl_title), - KEY (tl_namespace,tl_title) + KEY (tl_namespace,tl_title,tl_from) ) TYPE=InnoDB; @@ -410,7 +410,7 @@ CREATE TABLE /*$wgDBprefix*/imagelinks ( il_to varchar(255) binary NOT NULL default '', UNIQUE KEY il_from (il_from,il_to), - KEY (il_to) + KEY (il_to,il_from) ) TYPE=InnoDB; diff --git a/maintenance/updaters.inc b/maintenance/updaters.inc index d7c41aced6..f319cb4dd9 100644 --- a/maintenance/updaters.inc +++ b/maintenance/updaters.inc @@ -795,6 +795,32 @@ function do_rc_indices_update() { } } +function index_has_field($table, $index, $field) { + global $wgDatabase; + echo( "Checking if $table index $index includes field $field...\n" ); + $info = $wgDatabase->indexInfo( $table, $index, __METHOD__ ); + if( $info ) { + foreach($info as $row) { + if($row->Column_name == $field) { + echo( "...index $index on table $table seems to be ok\n" ); + return true; + } + } + } + echo( "...index $index on table $table has no field $field; adding\n" ); + return false; +} + +function do_backlinking_indices_update() { + echo( "Checking for backlinking indices...\n" ); + if (!index_has_field('pagelinks', 'pl_namespace', 'pl_from') || + !index_has_field('templatelinks', 'tl_namespace', 'tl_from') || + !index_has_field('imagelinks', 'il_to', 'il_from')) + { + dbsource( archive( 'patch-backlinkindexes.sql' ) ); + } +} + function do_all_updates( $doShared = false ) { global $wgNewTables, $wgNewFields, $wgRenamedTables, $wgSharedDB, $wgDatabase, $wgDBtype; @@ -860,6 +886,8 @@ function do_all_updates( $doShared = false ) { do_page_random_update(); flush(); do_rc_indices_update(); flush(); + + do_backlinking_indices_update(); flush(); initialiseMessages(); flush(); }