tell mysql to ignore the sort index for search queries

mysql really likes to pick an index for sorting if it can't fully satisfy the where
filter with an index, since search queries pretty much never are fully filtered by index
mysql often picks an index for sorting instead of the *much* more useful index for filtering.

To bypass this, we tell mysql explicitly not to use the mtime (the default order field) index,
so it will instead pick an index that is actually useful.

Signed-off-by: Robin Appelman <robin@icewind.nl>
This commit is contained in:
Robin Appelman 2021-10-18 18:05:48 +02:00
parent 7f272dd98f
commit 5002bf9cc1
No known key found for this signature in database
GPG key ID: 42B69D8A64526EFB

View file

@ -840,7 +840,13 @@ class Cache implements ICache {
protected function buildSearchQuery(ISearchQuery $searchQuery): IQueryBuilder {
$builder = $this->getQueryBuilder();
$query = $builder->selectFileCache('file');
// mysql really likes to pick an index for sorting if it can't fully satisfy the where
// filter with an index, since search queries pretty much never are fully filtered by index
// mysql often picks an index for sorting instead of the *much* more useful index for filtering.
//
// To bypass this, we tell mysql explicitly not to use the mtime (the default order field) index,
// so it will instead pick an index that is actually useful.
$query = $builder->selectFileCache('file', 'ignore index for order by (fs_mtime)');
$query->whereStorageId();