Какие еще действия предпринять для увеличения скорости выборки в MySQL?

Имеется большая таблица, в которой около 3млн строк. Все индексы проставлены верно. Но они уже не спасают, т.к. запрос подобный этому:
SELECT a.id, a.title, a.body FROM articles a WHERE a.isDeleted=0 AND a.isReady=1 AND a.id IN (1,2,3,4,5,6,7)

после перезагрузки сервера выполняется около секунды.
Так же в эту таблицу каждый день добавляется примерно по 1000 новых записей.

Что можно сделать для увеличения скорости выборки?

Вот реальный запрос, который выполняется:
SELECT   a.ID  FROM articles a WHERE a.ID IN       (244420, 244568, 290772, 440668, 483669, 515012, 536432, 581513, 1096597, 1465361, 1801110, 1950167, 2101815, 2337877, 2960983, 2963083, 2968763, 2971218, 2971692, 2976138, 2978343, 2979835, 2982769, 2985508, 2997775, 3005673, 3009886, 3010798, 3013842, 3014869, 3021023, 3025274, 3028399, 3029632, 3037355, 3040442, 3051786, 3053527, 3059715, 3065847, 3072606, 3088423, 3095432, 3096762, 3119841, 3121399, 3131721, 3149442, 3160328)       AND Ready = TRUE AND IsDeleted = FALSE ORDER BY a.ID DESC LIMIT 42;

EXPLAIN:
+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-------------+
| id | select_type | table | partitions | type  | possible_keys | key     | key_len | ref  | rows | filtered | Extra       |
+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | a     | NULL       | range | PRIMARY       | PRIMARY | 4       | NULL |   49 |     1.00 | Using where |
+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-------------+
  • Вопрос задан
  • 364 просмотра
Решения вопроса 1
@remzalp
Программер чего попало на чем попало
Фрагмент запроса "a.ID IN (ннн,нн)" уже выбирает максимально быстрым методом по первичному ключу всю необходимую информацию, которая дальше дофильтровывается.

Дальше уже вопрос - а насколько много столбцов Вы получаете запросом, есть ли там лишние?
Есть ли столбцы типа TEXT, Varchar, у которых переменная длина, что может немного понизить производительность в нкоторых операциях.

Следующий вопрос - а не пора ли оптимизировать настройки сервера - кэш, память. Начиная с mysqltuner.com , заканчивая вдумчивым анализом манов и статистики использования.

Наивный вопрос - Вы так часто ребутите сервер, что первая секунда в первом запросе так критична?
После первого обращения к таблице индекс (частично?) грузится в оперативную память и пока не вытеснится кем-то еще - очень хорошо ускоряет процесс запроса. Отсюда есть интересное следствие - много индексов могут быть даже вредны - в запросе они не задействуются, а занимают место на жестком диске и в оперативной памяти.

И еще для тестов без кэширования ребутить сервер не надо. Используйте:
SELECT SQL_NO_CACHE a.ID FROM articles a WHERE ...
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
В запросе используется только первичный ключ, скорее всего по ID. Попробуйте добавить составной ключ (ID, Ready, IsDeleted).
Ответ написан
Комментировать
@shagguboy
>после перезагрузки сервера выполняется около секунды.
буффер пул пустой. было чтото про быстрые прогрев, у Percona точно. Еще может помочь партиционирование.
Ответ написан
Комментировать
@psycho-coder
Eternal student
Список индексов приложите.
Включен лог медленных запросов? Если да, то что в нем?
Настройки базы?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы