оптимизировать индексы MySQL - PullRequest
0 голосов
/ 18 ноября 2011

У меня медленный (в течение 1,4 секунды) запрос, который некоторое время мне не давал покоя, поэтому я просто решил поднять его и посмотреть, сможет ли кто-нибудь помочь мне оптимизировать мои индексы, чтобы ускорить его:

select sql_calc_found_rows t.id, q.im_id, concat(t.si_id, ' ', t.de), q.date, q.das, q.dac, u.name, q.ac, q.st
from t300q q
left join t300 t on t.id = q.con_id
left join users u on u.id = q.user_id
order by q.date desc limit 0,100

sql объяснить результаты:

SIMPLE q ALL     89126 Using filesort
SIMPLE t eq_ref PRIMARY PRIMARY 4 db.q.con_id 1
SIMPLE u eq_ref PRIMARY PRIMARY 4 db.q.user_id 1

статистика сеанса:

Handler_read_first = 0
Handler_read_key = 177934
Handler_read_next = 23
Handler_read_prev = 679
Handler_read_rnd = 15
Handler_read_rnd_next = 89127

и у меня есть следующие индексы:

t.id - primary key

q.con_id    |
q.date      | - all form a single index
q.user_id   |

u.id - primary key

, как вы можете видеть изобработчик сообщает, что размер таблицы q составляет 89126 строк.

Это не большая проблема, но я хотел бы снизить скорость для этого запроса ниже 1 секунды, если это возможно.

Ответы [ 3 ]

1 голос
/ 18 ноября 2011

Кстати, mysql использует только равенство для первых двух столбцов индекса из 3 столбцов.Последний столбец может использовать ранжированные запросы.

А именно:

WHERE x=? AND y=? order by z;

будет использовать индекс столбцов (x, y, z) (поскольку z может быть ранжирован).

Попробуйте переместить 'date' в3-й столбец и переписать запрос.

Если это не сработает, то mysql недостаточно умён, чтобы обрабатывать con_id и user_id в объединении. Возможно, вы могли бы переписать его так, чтобы эти условия объединения произошли в предложении where.

1 голос
/ 18 ноября 2011

Запрос медленный, потому что у вас нет индекса даты. Составной индекс нельзя использовать, потому что дата находится посередине. Либо переместите дату, чтобы она стала первым полем в существующем индексе, либо создайте автономный индекс.

0 голосов
/ 18 ноября 2011

попробуйте запустить OPTIMIZE или ANALYZE в вашей базе данных, но убедитесь, что вы запускаете это в то время, когда существует только несколько запросов или намного лучше, если нет запросов, которые выполняются на сервере, чтобы избежать проблем с возникать вы можете увидеть больше информации об этих утверждениях по этим ссылкам:

http://dev.mysql.com/doc/refman/5.6/en/analyze-table.html http://dev.mysql.com/doc/refman/4.1/en/optimize-table.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...