From 861fbd06a5d7c9100ea2f8fedee43f68c2396054 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Thu, 11 Mar 2021 16:37:23 +0100 Subject: [PATCH] add a prefix index to filecache.path 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 --- core/Application.php | 4 ++++ core/Command/Db/AddMissingIndices.php | 7 +++++++ core/Migrations/Version13000Date20170718121200.php | 1 + 3 files changed, 12 insertions(+) diff --git a/core/Application.php b/core/Application.php index c3cb6f02ed5f8..93032e53d429a 100644 --- a/core/Application.php +++ b/core/Application.php @@ -112,6 +112,10 @@ function (GenericEvent $event) use ($container) { 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')) { diff --git a/core/Command/Db/AddMissingIndices.php b/core/Command/Db/AddMissingIndices.php index 1acff55fa40a2..a4f5918453742 100644 --- a/core/Command/Db/AddMissingIndices.php +++ b/core/Command/Db/AddMissingIndices.php @@ -144,6 +144,13 @@ private function addCoreIndexes(OutputInterface $output) { $updated = true; $output->writeln('Filecache table updated successfully.'); } + if (!$table->hasIndex('fs_path_prefix')) { + $output->writeln('Adding additional path index to the filecache table, this can take some time...'); + $table->addIndex(['size'], 'fs_path_prefix', [], ["lengths" => [128]]); + $this->connection->migrateToSchema($schema->getWrappedSchema()); + $updated = true; + $output->writeln('Filecache table updated successfully.'); + } } $output->writeln('Check indices of the twofactor_providers table.'); diff --git a/core/Migrations/Version13000Date20170718121200.php b/core/Migrations/Version13000Date20170718121200.php index 4912bef885738..2a9636336a600 100644 --- a/core/Migrations/Version13000Date20170718121200.php +++ b/core/Migrations/Version13000Date20170718121200.php @@ -262,6 +262,7 @@ public function changeSchema(IOutput $output, \Closure $schemaClosure, array $op $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')) {