]> source.dussan.org Git - nextcloud-server.git/commitdiff
add a prefix index to filecache.path 26070/head
authorRobin Appelman <robin@icewind.nl>
Thu, 11 Mar 2021 15:37:23 +0000 (16:37 +0100)
committerRobin Appelman <robin@icewind.nl>
Fri, 19 Mar 2021 17:52:25 +0000 (18:52 +0100)
The reason that `filecache.path` hasn't had an index added is the mysql limitation of ~1kb for indexeded fields,
which is to small for the `path`, however mysql supports indexing only the first N bytes of a column instead of the entire column,
allowing us to add an index even if the column is to long.

Because the index doesn't cover the entire column it can't be used in all situations where a normal index would be used, but it does cover the `path like 'folder/path/%'` queries that are used in various places.

Sqlite and Postgresql don't support prefix indexes, but they also don't have the 1kb limit and DBAL handles the differences in index creation.

Signed-off-by: Robin Appelman <robin@icewind.nl>
core/Application.php
core/Command/Db/AddMissingIndices.php
core/Migrations/Version13000Date20170718121200.php

index c3cb6f02ed5f8248921d63c03377ab7c1f47aa06..93032e53d429a4ab5054ee02f5f47b4c1c1b2f25 100644 (file)
@@ -112,6 +112,10 @@ class Application extends App {
                                        if (!$table->hasIndex('fs_size')) {
                                                $subject->addHintForMissingSubject($table->getName(), 'fs_size');
                                        }
+
+                                       if (!$table->hasIndex('fs_path_prefix')) {
+                                               $subject->addHintForMissingSubject($table->getName(), 'fs_path_prefix');
+                                       }
                                }
 
                                if ($schema->hasTable('twofactor_providers')) {
index 1acff55fa40a2f78018fd28b438387a1079c8d58..a4f5918453742034022d24cc4b4f7987dfdbb7fd 100644 (file)
@@ -144,6 +144,13 @@ class AddMissingIndices extends Command {
                                $updated = true;
                                $output->writeln('<info>Filecache table updated successfully.</info>');
                        }
+                       if (!$table->hasIndex('fs_path_prefix')) {
+                               $output->writeln('<info>Adding additional path index to the filecache table, this can take some time...</info>');
+                               $table->addIndex(['size'], 'fs_path_prefix', [], ["lengths" => [128]]);
+                               $this->connection->migrateToSchema($schema->getWrappedSchema());
+                               $updated = true;
+                               $output->writeln('<info>Filecache table updated successfully.</info>');
+                       }
                }
 
                $output->writeln('<info>Check indices of the twofactor_providers table.</info>');
index 4912bef885738cb899b6dbabd861fcc2eacc978f..2a9636336a600807f031bf58b2b158a92b37c840 100644 (file)
@@ -262,6 +262,7 @@ class Version13000Date20170718121200 extends SimpleMigrationStep {
                        $table->addIndex(['storage', 'size', 'fileid'], 'fs_storage_size');
                        $table->addIndex(['mtime'], 'fs_mtime');
                        $table->addIndex(['size'], 'fs_size');
+                       $table->addIndex(['path'], 'fs_path_prefix', [], ["lengths" => [128]]);
                }
 
                if (!$schema->hasTable('group_user')) {