Skip to content

Recommendations app causes slow queries saturating mysql #544

@max-nextcloud

Description

@max-nextcloud

We're seeing a lot of sloooow queries due to the recommendations app. So many it actually brought the server to a halt.

They all have a similar pattern but differ in lenght.
Here's one example from mysqldumpslow. As you can see the query is taking ~ 25 min. on average.

Count: 33  Time=1602.62s (52886s)  Lock=0.01s (0s)  Rows_sent=7.0 (231), Rows_examined=7505485.0 (247681005), 
query from mysqldump slow
SELECT `file`.`fileid`, `storage`, `path`, `path_hash`, `file`.`parent`, `name`, `mimetype`, `mimepart`, `size`, `mtime`, `storage_mtime`, `encrypted`, `etag`, `permissions`, `checksum`, `metadata_etag`, `creation_time`, `upload_time`
FROM `oc_filecache` `file`
LEFT JOIN `oc_filecache_extended` `fe` ON `file`.`fileid` = `fe`.`fileid`
WHERE ((`mimetype` <> N) OR (`size` = N))
AND (
  (
    (`storage` = N) AND ((`path` = 'S') OR (`path` LIKE 'S'))
  ) 
  OR 
  (
    ((`storage` = N) AND ((`path_hash` = 'S') OR (`path` LIKE 'S')))
    AND 
    ((`path_hash` = 'S') OR (`path` LIKE 'S'))
  )
  OR (
    ...
  )
)
ORDER BY `mtime` + 'S' desc
LIMIT N

The actual values for the order and limit query are:

ORDER BY `mtime` + '0' desc LIMIT 7

This looks very much like the call to getRecent in

*/
public function getMostRecentRecommendation(IUser $user, int $max): array {
/** @var IRootFolder $rootFolder */
$rootFolder = $this->serverContainer->get(IRootFolder::class);
$userFolder = $rootFolder->getUserFolder($user->getUID());
return array_filter(array_map(function (Node $node) use ($userFolder): ?RecommendedFile {
try {
$parentPath = dirname($node->getPath());
if ($parentPath === '' || $parentPath === '.' || $parentPath === '/') {
$parentPath = $node->getParent()->getPath();
}
return new RecommendedFile(
$userFolder->getRelativePath($parentPath),
$node,
$node->getMTime(),
$this->l10n->t("Recently edited")
);
} catch (StorageNotAvailableException $e) {
return null;
}
}, $userFolder->getRecent($max)), function (?RecommendedFile $entry): bool {
return $entry !== null;
});
}

Given that $max is 7 by default.

SHOW PROCESSLIST shows them as Creating sort index most of the time.

So maybe all we are missing is an index on mtime + '0'. Or maybe we should do away with the + '0'.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions