summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorblizzz <blizzz@arthur-schiwon.de>2022-05-16 12:22:05 +0200
committerGitHub <noreply@github.com>2022-05-16 12:22:05 +0200
commitadc069096068d265ec7cd34842a954b1e0c3a3ee (patch)
tree50838add936b39cb67ec9e4fde11060f12d171b0
parentcf31a301db16e9f0c0b464c950712872b321b167 (diff)
parent2831da14be6d787e8fc9231822a26a14ed48db61 (diff)
downloadnextcloud-server-adc069096068d265ec7cd34842a954b1e0c3a3ee.tar.gz
nextcloud-server-adc069096068d265ec7cd34842a954b1e0c3a3ee.zip
Merge pull request #32124 from nextcloud/backport/32074/stable23
[stable23] tell mysql to ignore the sort index for search queries
-rw-r--r--lib/private/DB/QueryBuilder/QueryBuilder.php2
-rw-r--r--lib/private/Files/Cache/SearchBuilder.php11
-rw-r--r--lib/public/DB/QueryBuilder/IQueryBuilder.php2
3 files changed, 13 insertions, 2 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());
}
}
diff --git a/lib/public/DB/QueryBuilder/IQueryBuilder.php b/lib/public/DB/QueryBuilder/IQueryBuilder.php
index 7829696970c..c4167b2175f 100644
--- a/lib/public/DB/QueryBuilder/IQueryBuilder.php
+++ b/lib/public/DB/QueryBuilder/IQueryBuilder.php
@@ -824,7 +824,7 @@ interface 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.