Индексирование этого запроса MySQL - PullRequest
3 голосов
/ 09 сентября 2010

Я запрашиваю базу данных следующим запросом.Выполнение этого запроса занимает 21 секунду.
У меня есть проверка по запросу объяснения.У меня есть индекс для полей groupId, batchId отдельно.

EXPLAIN SELECT message, sentOn, maskId, isDndCheck, contentType
FROM sms_histories
WHERE groupId = 1750
GROUP BY batchId
ORDER BY batchId DESC
LIMIT 0 , 1

По этому запросу я получаю последнее сообщение группы.

Мой запрос объяснения показывает мне результат

id  select_type     table       type    possible_keys   key     key_len     ref     rows    Extra
1      SIMPLE   sms_histories    index      groupId     batchId     5        NULL    888    Using where 

скажите, пожалуйста, в чем проблема, почему этот запрос занимает так много времени?

Ответы [ 3 ]

1 голос
/ 09 сентября 2010

Вам потребуется составной индекс на (groupId, batchId), чтобы ORDER BY оптимизация заработала. MySQL не может использовать только индекс batchId, потому что в нем смешаны все groupId.

(хотя я немного запутался в том, что должен делать запрос. У вас есть GROUP BY без агрегированных столбцов. Если batchId является первичным ключом sms_histories, тогда появится GROUP BY ничего не делать. Если это не первичный ключ, то запрос не является допустимым SQL и MySQL будет возвращать строку с полуслучайным значением.)

1 голос
/ 09 сентября 2010

Я думаю, что вы должны использовать составной индекс для batchId и groupId, как сказал bobince. Я думаю, что в вашей таблице будет много данных sms_histories. и, как сказал Бобинсе, вы используете немного неудобную схему базы данных. Вы должны попытаться нормализовать его и удалить репликации из него. Вы должны сосредоточиться больше на схеме базы данных, прежде чем начинать новый проект. поэтому главное - попробовать индексировать batchId и groupId оба.

1 голос
/ 09 сентября 2010

Я заметил, что groupId является типом CHAR.Вам нужен восходящий индекс в поле groupId.Но, если возможно, рассмотрите возможность изменения типа GroupId на INTEGER.

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