Page MenuHomePhabricator

USE INDEX is inserted in the wrong place when left joining in other tables
Open, MediumPublic

Description

After r82659, the following query was created

SELECT user_name,MAX(user_id) AS user_id,MAX(user_editcount) AS edits,COUNT(ug_group) AS numgroups,MAX(ug_group) AS singlegroup,MIN(user_registration) AS creation,MAX(ipb_deleted) AS ipb_deleted FROM mw_user LEFT JOIN mw_user_groups ON ((user_id=ug_user)) LEFT JOIN mw_ipblocks ON ((user_id=ipb_user AND ipb_deleted=1 AND ipb_auto=0)) FORCE INDEX (user_name) WHERE (ipb_deleted IS NULL) GROUP BY user_name ORDER BY user_name LIMIT 51\G

It needs to be

SELECT user_name,MAX(user_id) AS user_id,MAX(user_editcount) AS edits,COUNT(ug_group) AS numgroups,MAX(ug_group) AS singlegroup,MIN(user_registration) AS creation,MAX(ipb_deleted) AS ipb_deleted FROM mw_user FORCE INDEX (user_name) LEFT JOIN mw_user_groups ON ((user_id=ug_user)) LEFT JOIN mw_ipblocks ON ((user_id=ipb_user AND ipb_deleted=1 AND ipb_auto=0)) WHERE (ipb_deleted IS NULL) GROUP BY user_name ORDER BY user_name LIMIT 51\G

http://svn.wikimedia.org/viewvc/mediawiki/branches/REL1_17/phase3/includes/specials/SpecialListusers.php?view=annotate

^ It seems in 1.17 (I broke the index inclusion in r79699) it's done a bit hackily...


Version: 1.18.x
Severity: normal

Details

Reference
bz27659

Event Timeline

bzimport raised the priority of this task from to Medium.Nov 21 2014, 11:30 PM
bzimport set Reference to bz27659.
bzimport added a subscriber: Unknown Object (MLST).
		if ( !empty( $conds ) ) {
			if ( is_array( $conds ) ) {
				$conds = $this->makeList( $conds, LIST_AND );
			}
			$sql = "SELECT $startOpts $vars $from $useIndex WHERE $conds $preLimitTail";
		} else {
			$sql = "SELECT $startOpts $vars $from $useIndex $preLimitTail";
		}

$from is only right when not LEFT JOIN'ing in tables