У меня есть запрос на соединение на 2 таблицы. Я делаю этот запрос 2 раза для разбивки на страницы. Я сделал один запрос SQL_CALC_FOUND_ROWS раньше.MySQL Оптимизация запроса
Таблица A содержит 145000 строк Таблица B содержит 91000 строк
Эти MyISAM таблицы.
Таблица А как это:
id MEDIUMINT(6) UNSIGNED PK
id_b MEDIUMINT(6) UNSIGNED INDEX
rights ENUM ('0', '1', '2', '3', '4', '5', '6', '7', '8') INDEX
avail ENUM ('0', '1', '2', '3') INDEX
del_date DATE INDEX
... and 40 others fields
И эти индексы:
rights, avail, del_date
id_b, rights, avail, del_date
Таблица B выглядит так:
id MEDIUMINT(6) UNSIGNED PK
title VARCHAR(150) INDEX
.. and 47 others fields
Так вот запросы:
SELECT COUNT(*)
FROM A
INNER JOIN B ON B.id = A.id_b
WHERE
A.rights NOT IN ('7')
AND (A.del_date IS NULL OR A.del_date > '2016-02-17')
AND A.avail NOT IN ('0')
ORDER BY B.title;
SELECT A.*, B.*
FROM A
INNER JOIN B ON B.id = A.id_b
WHERE
A.rights NOT IN ('7')
AND (A.del_date IS NULL OR A.del_date > '2016-02-17')
AND A.avail NOT IN ('0')
ORDER BY B.title
LIMIT 0, 20;
Первый запрос на самом деле занимает 2 секунды и 2-й 0,3 секунды. Прежде чем пытаться оптимизировать max, который я могу, это иногда занимает 10 секунд или более для запроса SQL_CALC_FOUND_ROWS.
Оптимизация я сделал:
- подавляют SQL_CALC_FOUND_ROWS и сделать это с 2-запросов.
- права поля и использовать были TINYINT (4) UNSIGNED, теперь они ENUM
- Я добавил эти 2 части индексов права, Avail, del_date & id_b, права, воспользоваться, del_date для оптимизации ORDER BY пункт (очень хороший прирост)
Но теперь я заметил, что (A.del_date IS NULL OR A.del_date> '2016-02-17') является причиной медлительности.
Если удалить все это условие (A.del_date IS NULL OR A.del_date> '2016-02-17') или просто A.del_date IS NULL, запрос очень быстро.
Любая помощь будет очень оценена!
Вопросы производительности должны включать в себя «EXPLAIN ANALYZE» и некоторую информацию о размере таблицы, индексе, текущем времени, времени ожидания и т. Д. «Slow» - относительный термин, и нам нужна реальная ценность для сравнения. [MySQL] (http://dba.stackexchange.com/questions/15371/how-do-i-get-the-execution-plan-for-a-view) –