Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nextcloud/server.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobin Appelman <robin@icewind.nl>2022-04-22 14:31:34 +0300
committerbackportbot[bot] <backportbot[bot]@users.noreply.github.com>2022-04-25 14:56:48 +0300
commit0edce619c8822d3051886ee1b501d5f153e162a7 (patch)
treeb5ee334db20fee405d89ba9f74dd267c2b8c93d9 /lib/private
parent49cd75b1af8b95ddd488c78e3906b8e03d2179b7 (diff)
tell mysql to ignore the sort index for search queriesbackport/32074/stable22
Signed-off-by: Robin Appelman <robin@icewind.nl>
Diffstat (limited to 'lib/private')
-rw-r--r--lib/private/DB/QueryBuilder/QueryBuilder.php2
-rw-r--r--lib/private/Files/Cache/SearchBuilder.php11
2 files changed, 12 insertions, 1 deletions
diff --git a/lib/private/DB/QueryBuilder/QueryBuilder.php b/lib/private/DB/QueryBuilder/QueryBuilder.php
index 89265c74fae..bf5ec2f6bec 100644
--- a/lib/private/DB/QueryBuilder/QueryBuilder.php
+++ b/lib/private/DB/QueryBuilder/QueryBuilder.php
@@ -1119,7 +1119,7 @@ class QueryBuilder implements IQueryBuilder {
/**
* Adds an ordering to the query results.
*
- * @param string $sort The ordering expression.
+ * @param string|ILiteral|IParameter|IQueryFunction $sort The ordering expression.
* @param string $order The ordering direction.
*
* @return $this This QueryBuilder instance.
diff --git a/lib/private/Files/Cache/SearchBuilder.php b/lib/private/Files/Cache/SearchBuilder.php
index 003d3ac15e7..c8c442bcb8c 100644
--- a/lib/private/Files/Cache/SearchBuilder.php
+++ b/lib/private/Files/Cache/SearchBuilder.php
@@ -232,6 +232,17 @@ class SearchBuilder {
if ($field === 'fileid') {
$field = 'file.fileid';
}
+
+ // 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.
+ //
+ // By changing the order by to an expression, mysql isn't smart enough to see that it could still
+ // use the index, so it instead picks an index for the filtering
+ if ($field === 'mtime') {
+ $field = $query->func()->add($field, $query->createNamedParameter(0));
+ }
+
$query->addOrderBy($field, $order->getDirection());
}
}