For some unknown reason, when the `actor` table has few enough rows (or
few enough compared to `logging`) MariaDB 10.1.37 decides it makes more
sense to fetch everything from `actor` + `logging` and filesort rather than
fetching the limited number of rows from `logging`.
We can work around it by telling it to not reorder the query.
Bug: T220999
Bug: T221458
Change-Id: I9da981c09f18ba72efeeb8279aad99eb21af699a
}
}
+ // 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();
# Don't show duplicate rows when using log_search
$joins['log_search'] = [ 'JOIN', 'ls_log_id=log_id' ];
+ // T221458: 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 tag filtering was used, as it seems as likely
+ // to be harmed as helped in that case.
+ if ( !$this->mTagFilter ) {
+ $options[] = 'STRAIGHT_JOIN';
+ }
+
$info = [
'tables' => $tables,
'fields' => $fields,