updateCollation.php: Switch back to using cl_from index for now
authorKevin Israel <pleasestand@live.com>
Fri, 20 Nov 2015 03:13:17 +0000 (22:13 -0500)
committerTim Starling <tstarling@wikimedia.org>
Thu, 21 Jan 2016 05:57:48 +0000 (05:57 +0000)
Using the cl_sortkey index instead (to reduce disruption to a live
site), as currently implemented, seems to have two serious problems:

* MySQL / MariaDB filesorts all rows that "sort above the given row
  [the last row of the previous batch]", not just a single category
  at a time until the row limit is reached.
* The current approach to pagination is broken in that it does not
  work with ENUM columns such as cl_type, causing 'file' rows to be
  skipped, or rows of any type to be repeated. See T119173.

This reverts part of commit a43f751cf6b6849e.

Bug: T58041
Change-Id: I619564e85b2122f249bdacc45d547b9ce1b3beb5

maintenance/updateCollation.php

index bb75314..bd75b3b 100644 (file)
@@ -86,7 +86,7 @@ TEXT;
 
                $options = array(
                        'LIMIT' => self::BATCH_SIZE,
 
                $options = array(
                        'LIMIT' => self::BATCH_SIZE,
-                       'ORDER BY' => 'cl_to, cl_type, cl_from',
+                       'ORDER BY' => 'cl_from, cl_to',
                        'STRAIGHT_JOIN',
                );
 
                        'STRAIGHT_JOIN',
                );
 
@@ -132,7 +132,7 @@ TEXT;
                        $res = $dbw->select(
                                array( 'categorylinks', 'page' ),
                                array( 'cl_from', 'cl_to', 'cl_sortkey_prefix', 'cl_collation',
                        $res = $dbw->select(
                                array( 'categorylinks', 'page' ),
                                array( 'cl_from', 'cl_to', 'cl_sortkey_prefix', 'cl_collation',
-                                       'cl_sortkey', 'cl_type', 'page_namespace', 'page_title'
+                                       'cl_sortkey', 'page_namespace', 'page_title'
                                ),
                                array_merge( $collationConds, $batchConds, array( 'cl_from = page_id' ) ),
                                __METHOD__,
                                ),
                                array_merge( $collationConds, $batchConds, array( 'cl_from = page_id' ) ),
                                __METHOD__,
@@ -216,13 +216,13 @@ TEXT;
 
        /**
         * Return an SQL expression selecting rows which sort above the given row,
 
        /**
         * Return an SQL expression selecting rows which sort above the given row,
-        * assuming an ordering of cl_to, cl_type, cl_from
+        * assuming an ordering of cl_from, cl_to
         * @param stdClass $row
         * @param DatabaseBase $dbw
         * @return string
         */
        function getBatchCondition( $row, $dbw ) {
         * @param stdClass $row
         * @param DatabaseBase $dbw
         * @return string
         */
        function getBatchCondition( $row, $dbw ) {
-               $fields = array( 'cl_to', 'cl_type', 'cl_from' );
+               $fields = array( 'cl_from', 'cl_to' );
                $first = true;
                $cond = false;
                $prefix = false;
                $first = true;
                $cond = false;
                $prefix = false;