* 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 ==
--- /dev/null
+--
+-- 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);
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;
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;
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;
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,
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;
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;
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;
}
}
+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;
do_page_random_update(); flush();
do_rc_indices_update(); flush();
+
+ do_backlinking_indices_update(); flush();
initialiseMessages(); flush();
}