From 5b89d3439729e01a610e7ebf685282fd0bd09ba2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=20Molakvo=C3=A6?= Date: Thu, 4 Nov 2021 11:10:46 +0100 Subject: [PATCH] Revert "[21] tell mysql to ignore the sort index for search queries" --- lib/private/DB/QueryBuilder/QueryBuilder.php | 17 ----------------- lib/private/Files/Cache/Cache.php | 8 +------- lib/private/Files/Cache/CacheQueryBuilder.php | 19 +++---------------- 3 files changed, 4 insertions(+), 40 deletions(-) diff --git a/lib/private/DB/QueryBuilder/QueryBuilder.php b/lib/private/DB/QueryBuilder/QueryBuilder.php index 82add039cf551..352829a56ae79 100644 --- a/lib/private/DB/QueryBuilder/QueryBuilder.php +++ b/lib/private/DB/QueryBuilder/QueryBuilder.php @@ -1301,21 +1301,4 @@ public function quoteAlias($alias) { return $this->helper->quoteColumnName($alias); } - - /** - * Either appends to or replaces a single, generic query part. - * - * The available parts are: 'select', 'from', 'set', 'where', - * 'groupBy', 'having' and 'orderBy'. - * - * @param string $sqlPartName - * @param mixed $sqlPart - * @param bool $append - * - * @return $this This QueryBuilder instance. - */ - public function add(string $sqlPartName, $sqlPart, bool $append = false) { - $this->queryBuilder->add($sqlPartName, $sqlPart, $append); - return $this; - } } diff --git a/lib/private/Files/Cache/Cache.php b/lib/private/Files/Cache/Cache.php index 4e5edc0e0a6bf..34ed6d33a2d8c 100644 --- a/lib/private/Files/Cache/Cache.php +++ b/lib/private/Files/Cache/Cache.php @@ -848,13 +848,7 @@ public function searchByMime($mimetype) { protected function buildSearchQuery(ISearchQuery $searchQuery): IQueryBuilder { $builder = $this->getQueryBuilder(); - // 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 = $builder->selectFileCache('file'); $query->whereStorageId(); diff --git a/lib/private/Files/Cache/CacheQueryBuilder.php b/lib/private/Files/Cache/CacheQueryBuilder.php index 9847375495e30..2215cef9a15a0 100644 --- a/lib/private/Files/Cache/CacheQueryBuilder.php +++ b/lib/private/Files/Cache/CacheQueryBuilder.php @@ -26,7 +26,6 @@ namespace OC\Files\Cache; -use Doctrine\DBAL\Platforms\MySQLPlatform; use OC\DB\QueryBuilder\QueryBuilder; use OC\SystemConfig; use OCP\DB\QueryBuilder\IQueryBuilder; @@ -46,24 +45,12 @@ public function __construct(IDBConnection $connection, SystemConfig $systemConfi $this->cache = $cache; } - public function selectFileCache(string $alias = null, string $mysqlIndexHint = '') { + public function selectFileCache(string $alias = null) { $name = $alias ? $alias : 'filecache'; $this->select("$name.fileid", 'storage', 'path', 'path_hash', "$name.parent", 'name', 'mimetype', 'mimepart', 'size', 'mtime', 'storage_mtime', 'encrypted', 'etag', 'permissions', 'checksum', 'metadata_etag', 'creation_time', 'upload_time') - ->from('filecache', $name); - if ($mysqlIndexHint !== '' && $this->getConnection()->getDatabasePlatform() instanceof MySQLPlatform) { - $this->add('join', [ - $this->quoteAlias($name) => [ - // horrible query builder crimes to sneak in raw sql after the "FROM oc_filecache $name" - 'joinType' => $mysqlIndexHint . ' left', - 'joinTable' => $this->getTableName('filecache_extended'), - 'joinAlias' => $this->quoteAlias('fe'), - 'joinCondition' => $this->expr()->eq("$name.fileid", 'fe.fileid'), - ], - ], true); - } else { - $this->leftJoin($name, 'filecache_extended', 'fe', $this->expr()->eq("$name.fileid", 'fe.fileid')); - } + ->from('filecache', $name) + ->leftJoin($name, 'filecache_extended', 'fe', $this->expr()->eq("$name.fileid", 'fe.fileid')); $this->alias = $name;