Задать вопрос

Какие еще действия предпринять для увеличения скорости выборки в 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 |
+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-------------+
  • Вопрос задан
  • 365 просмотров
Подписаться 3 Оценить 2 комментария
Решение пользователя PrAw К ответам на вопрос (4)
@remzalp
Программер чего попало на чем попало
Фрагмент запроса "a.ID IN (ннн,нн)" уже выбирает максимально быстрым методом по первичному ключу всю необходимую информацию, которая дальше дофильтровывается.

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

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

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

И еще для тестов без кэширования ребутить сервер не надо. Используйте:
SELECT SQL_NO_CACHE a.ID FROM articles a WHERE ...
Ответ написан
Комментировать