У меня проблема с этим простым запросом MySQL:
select sender as id from message where status=1 and recipient=1
где таблица отправителя содержит несколько миллионов строк.
Когда я запускаю это в SequelPro, в первый раз он работает очень медленно, ~ 4 секунды или более, а при следующем выполнении он работает очень быстро, ~ 0,018 секунды. Однако, если я снова запущу через пару минут, он снова сделает то же самое.
Я пытался использовать SQL_NO_CACHE, и он все равно дает мне тот же результат.
Механизм БД — innoDB, а БД — кластер MySQL Percona XtraDB. Вот результаты объяснения:
|id|select_type|table |type|possible_keys |key |key_len|ref |row |Extra
| 1|SIMPLE |message|ref |recipient,status, sent|sent|12 |const,const |2989 |NULL
«отправлено» — это индекс многостолбцового сообщения (получатель, статус). Кто-нибудь знает, как решить эту проблему?
Спасибо.
Добавлено (из комментария)
CREATE TABLE 'message' (
'id' int(20) NOT NULL AUTO_INCREMENT,
'sender' bigint(20) NOT NULL,
'recipient' bigint(20) NOT NULL,
'status' int(5) NOT NULL,
'date' timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY ('id'),
KEY 'id' ('id'),
KEY 'recipient' ('recipient'),
KEY 'sender' ('sender'),
KEY 'date' ('date'),
KEY 'status' ('status'),
KEY 'sent' ('status','recipient')
) ENGINE=InnoDB AUTO_INCREMENT=90224500 DEFAULT CHARSET=latin1;
select sender as id from message where status=1 and recipient=1 LIMIT 10
ИЛИ вы также можете использовать смещение, напримерselect sender as id from message where status=1 and recipient=1 LIMIT 10 OFFSET 15
- person Sanjay Chaudhari   schedule 11.03.2016