bugfix 6440: updated indexes to improve backlinking queries. May be very slow on...
authorYuri Astrakhan <yurik@users.mediawiki.org>
Sat, 11 Nov 2006 21:38:18 +0000 (21:38 +0000)
committerYuri Astrakhan <yurik@users.mediawiki.org>
Sat, 11 Nov 2006 21:38:18 +0000 (21:38 +0000)
RELEASE-NOTES
maintenance/archives/patch-backlinkindexes.sql [new file with mode: 0644]
maintenance/mysql5/tables.sql
maintenance/oracle/tables.sql
maintenance/tables.sql
maintenance/updaters.inc

index 510f825..d7f9316 100644 (file)
@@ -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 (file)
index 0000000..5facd9e
--- /dev/null
@@ -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);
index 1e63b91..ed8c684 100644 (file)
@@ -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;
 
index 6733f95..7b24d1e 100644 (file)
@@ -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,
index e68c9b0..d210179 100644 (file)
@@ -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;
 
index d7c41ac..f319cb4 100644 (file)
@@ -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();
 }