Проблема с загрузкой файлов

Проблема с загрузкой файлов

от Виталий Лавров -
Количество ответов: 2
Изображение пользователя Эксперт по Moodle

Есть учетная запись для методистов из которой активно заполняются ресурсы.
(в mdl_files за ней числится 25000 записей)

Периодически повляется проблема - если при загрузке файла выбрать "Недавно использованные файлы", то постгрес уходит в себя надолго (php и nginx его не дожидаются).

"Недавно использованные файлы" показывают по умолчанию только зпоследние 50 файлов, но запрос к базе сделан так, что он сначала выбирает все файлы, пару раз делает join и после этого берет только последние 50 файлов.

Возник вопрос - это в постгресе  такая странность или по этим граблям никто еще не прошел ?


В ответ на Виталий Лавров

Re: Проблема с загрузкой файлов

от Vadim Tabunshchik -
Изображение пользователя Developers

>> Есть учетная запись для методистов из которой активно заполняются ресурсы.

Под одной учеткой работает несколько пользователей?

>> Периодически повляется проблема

Проблема, случайно, появляется не в тот момент, когда несколько методистов активно заполняют ресурсы в одно и то же время?

Тогда я бы не удивлялся тормозам и это будет на любом сервере БД, имхо. userid то один и тот же, а запрос может поступать от нескольких методистов.

А «Количество недавно использованных файлов» не пробовали делать меньше? Вплоть до 0? Чтоб проверить, меньше тормозит или нет.

В ответ на Vadim Tabunshchik

Re: Проблема с загрузкой файлов

от Виталий Лавров -
Изображение пользователя Эксперт по Moodle
2-3 человека за год работы. Они переносили курсы со старого moodle-1.9
Я пробовал выполнять sql запрос - он работал ооочень долго.

Там очень нехороший запрос (repository/recent/lib.php):

'SELECT files1.*
                  FROM {files} files1
             LEFT JOIN {files_reference} r
                       ON files1.referencefileid = r.id
                  JOIN (
 SELECT contenthash, filename, MAX(id) AS id FROM {files} WHERE userid = :userid AND filename != :filename AND ((filearea = :filearea1 AND itemid = :itemid) OR filearea != :filearea2) GROUP BY contenthash, filename ) files2 ON files1.id = files2.id WHERE r.repositoryid is NULL ORDER BY files1.timemodified DESC limit 50'

Внутренний "SELECT contenthash, filename, MAX(id) AS id from {files}" - огромный и для filearea нет отдельного индекса.
Как временное решение я заменил:
"GROUP BY contenthash, filename"
на
"GROUP BY contenthash, filename, timemodified order by timemodified DESC LIMIT 50"