X-Git-Url: http://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2Fapi%2FApiQueryLogEvents.php;h=962d9561300c0ff60f8c62e08cc9263e1a02516b;hb=8963110d01b0f376d900171fe7506fed5df80cf8;hp=0934ab391df6eb95a895b34eb3c1421611eb7446;hpb=747bdd543d301e0816aa811806c6cc6b17ec1038;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/api/ApiQueryLogEvents.php b/includes/api/ApiQueryLogEvents.php index 0934ab391d..962d956130 100644 --- a/includes/api/ApiQueryLogEvents.php +++ b/includes/api/ApiQueryLogEvents.php @@ -112,7 +112,7 @@ class ApiQueryLogEvents extends ApiQueryBase { if ( !is_null( $params['tag'] ) ) { $this->addTables( 'change_tag' ); - $this->addJoinConds( [ 'change_tag' => [ 'INNER JOIN', + $this->addJoinConds( [ 'change_tag' => [ 'JOIN', [ 'log_id=ct_log_id' ] ] ] ); $changeTagDefStore = MediaWikiServices::getInstance()->getChangeTagDefStore(); try { @@ -183,6 +183,10 @@ class ApiQueryLogEvents extends ApiQueryBase { $db, 'log_user', User::newFromName( $params['user'], false ) ); $this->addWhere( $q['conds'] ); + + // T71222: MariaDB's optimizer, at least 10.1.37 and .38, likes to choose a wildly bad plan for + // some reason for this code path. Tell it not to use the wrong index it wants to pick. + $this->addOption( 'IGNORE INDEX', [ 'logging' => [ 'times' ] ] ); } $title = $params['title']; @@ -234,6 +238,14 @@ class ApiQueryLogEvents extends ApiQueryBase { } } + // T220999: MySQL/MariaDB (10.1.37) can sometimes irrationally decide that querying `actor` before + // `logging` and filesorting is somehow better than querying $limit+1 rows from `logging`. + // Tell it not to reorder the query. But not when `letag` was used, as it seems as likely + // to be harmed as helped in that case. + if ( $params['tag'] === null ) { + $this->addOption( 'STRAIGHT_JOIN' ); + } + $count = 0; $res = $this->select( __METHOD__ ); $result = $this->getResult();