Всем привет.
Есть сервер VDS на нем 4гига ОЗУ. SSD. Проц 2 ядра. MariaDB 10.11, PHP 7.4.
Есть таблица articles (статьи). Данная таблица имеет всего 2 индекса: На поле id и user_id.
Сама таблица имеет около 20к записей.
Выполняю запрос: SELECT * FROM articles LIMIT 1000 время выполнения ~0.5 сек.
Для меня это очень медленно. Эти 0.5 секунд сильно ощущаются на проде.
Выполняю тот же запрос на другом, более мощном сервере: 8 гигов ОЗУ, SSD, проц 4 ядра. MariaDB 10.11, PHP 7.4.
Запрос выполняется почти моментально: ~0.079сек.
В обоих случаях, при выполнении запроса, нагрузка на проц и память почти отсутствует.
Не могу понять в чем дело, в настройках софта или всё таки в железе ?
Звездочка * означает что все найденные документы будут физически переданы по сети на клиента.
Поэтому твои два эксперимента надо расширить. Проверить чем отличались условия с точки зрения
сети. Куда (как далеко) пердавались эти 1000 документов.
Очень принципиально по производительности имеет значение количество атрибутов в строке выборки, и есть ли там бинарные типы данных или длинные строки - это именно то, что будет просаживать производительность при попытке сделать большую выборку.
Если в реальной системе из этой таблицы выбираются сначала "легкие" атрибуты в тысячи записей, а потом по конкретным записям дозапрашиваются "тяжелые" атрибуты (бинарные данные, длинные строки).
То синтетический тест: SELECT * FROM articles LIMIT 1000
к реальной жизни не будет иметь никакого отношения, потому, что вы выбираете все атрибуты (*), при наличии "тяжелых" атрибутов, в здравом уме никто не будет делать такие большие выборки. Разве что, если это не импорт/экспорт - но это сам по себе процесс затяжной.
Всем спасибо за ответы! Проблема была решена снятием ограничителей MariaDB в my.cnf, а именно: max_connections и max_allowed_packet были увеличены во много раз. Теперь запросы выполняются одинаково моментально на обоих серверах.