Remove redundant UNIQUE from rev_page_id
authorAaron Schulz <aschulz@wikimedia.org>
Mon, 11 Apr 2016 21:01:43 +0000 (14:01 -0700)
committerLegoktm <legoktm.wikipedia@gmail.com>
Thu, 25 Aug 2016 06:30:41 +0000 (06:30 +0000)
The PRIMARY KEY is rev_id, so this is a waste and
makes the index slower to maintain (e.g. no change
buffering).

Bug: T142725
Change-Id: I63f817656ff5e62aa27caf607d70353cc99eb349

includes/installer/MysqlUpdater.php
maintenance/archives/patch-revision-page-rev-index-nonunique.sql [new file with mode: 0644]
maintenance/tables.sql

index 719b66a..6989969 100644 (file)
@@ -287,6 +287,7 @@ class MysqlUpdater extends DatabaseUpdater {
                        // 1.28
                        [ 'addIndex', 'recentchanges', 'rc_name_type_patrolled_timestamp',
                                'patch-add-rc_name_type_patrolled_timestamp_index.sql' ],
+                       [ 'doRevisionPageRevIndexNonUnique' ]
                ];
        }
 
@@ -1101,4 +1102,24 @@ class MysqlUpdater extends DatabaseUpdater {
                        'Making user_id unsigned int'
                );
        }
+
+       protected function doRevisionPageRevIndexNonUnique() {
+               if ( !$this->doTable( 'revision' ) ) {
+                       return true;
+               } elseif ( !$this->db->indexExists( 'revision', 'rev_page_id' ) ) {
+                       $this->output( "...rev_page_id index not found on revision.\n" );
+                       return true;
+               }
+
+               if ( !$this->db->indexUnique( 'revision', 'rev_page_id' ) ) {
+                       $this->output( "...rev_page_id index already non-unique.\n" );
+                       return true;
+               }
+
+               return $this->applyPatch(
+                       'patch-revision-page-rev-index-nonunique.sql',
+                       false,
+                       'Making rev_page_id index non-unique'
+               );
+       }
 }
diff --git a/maintenance/archives/patch-revision-page-rev-index-nonunique.sql b/maintenance/archives/patch-revision-page-rev-index-nonunique.sql
new file mode 100644 (file)
index 0000000..dbb0325
--- /dev/null
@@ -0,0 +1,5 @@
+-- Makes rev_page_id index non-unique
+ALTER TABLE /*_*/revision
+DROP INDEX /*i*/rev_page_id;
+
+CREATE INDEX /*i*/rev_page_id ON /*_*/revision (rev_page, rev_id);
index 40506bf..b5c14e3 100644 (file)
@@ -369,7 +369,7 @@ CREATE TABLE /*_*/revision (
 ) /*$wgDBTableOptions*/ MAX_ROWS=10000000 AVG_ROW_LENGTH=1024;
 -- In case tables are created as MyISAM, use row hints for MySQL <5.0 to avoid 4GB limit
 
-CREATE UNIQUE INDEX /*i*/rev_page_id ON /*_*/revision (rev_page, rev_id);
+CREATE INDEX /*i*/rev_page_id ON /*_*/revision (rev_page, rev_id);
 CREATE INDEX /*i*/rev_timestamp ON /*_*/revision (rev_timestamp);
 CREATE INDEX /*i*/page_timestamp ON /*_*/revision (rev_page,rev_timestamp);
 CREATE INDEX /*i*/user_timestamp ON /*_*/revision (rev_user,rev_timestamp);