Merge pull request #29551 from nextcloud/revert-29322-mysql-search-ignore-index-21

This commit is contained in:
John Molakvoæ 2021-11-04 11:24:39 +01:00 committed by GitHub
commit a2ccd43c32
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 4 additions and 40 deletions

View file

@ -1301,21 +1301,4 @@ class QueryBuilder implements IQueryBuilder {
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;
}
}

View file

@ -848,13 +848,7 @@ class Cache implements ICache {
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();

View file

@ -26,7 +26,6 @@ declare(strict_types=1);
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 @@ class CacheQueryBuilder extends QueryBuilder {
$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;