MySQL InnoDB таблица возвращает 20% строк, затем останавливается - PullRequest
0 голосов
/ 08 июня 2011

Я пытаюсь вернуть набор результатов из таблицы базы данных MySQL подписок электронной почты.

Таблица называется подпиской и выглядит следующим образом:

    +-----------------+------------------+------+-----+---------------------+-------+
    | Field           | Type             | Null | Key | Default             | Extra |
    +-----------------+------------------+------+-----+---------------------+-------+
    | eid             | int(11) unsigned | NO   | PRI | NULL                |       |
    | subscribeStatus | varchar(4)       | NO   | PRI | NULL                |       |
    | transDate       | datetime         | NO   | PRI | 0000-00-00 00:00:00 |       |
    | senttoevDate    | datetime         | YES  |     | NULL                |       |
    +-----------------+------------------+------+-----+---------------------+-------+

PK - это (eid, subscribeStatus, transDate) и существуют следующие дополнительные индексы:

idxEid на eid, idxTDate на transDate

Таблица является таблицей InnoDB.Он содержит около 480 тыс. Строк.

Версия MySQL - 5.1.39 x86_64, и я использую 64-разрядную версию Windows 7.

В таблицу вставляется строка каждый раз, когда пользователь подписывается или отписывается отЭл. адрес.Я хочу знать, какой последний статус подписки для всех пользователей.Запрос, который я хочу выполнить:

select 
  eid, transDate from subscribe s
where
  transDate = (select max(transDate) from subscribe si where si.eid = s.eid)

Когда я запускаю его в MySQL Query Browser (и в TOAD for MySQL), он сразу возвращает около 98K строк (в таблицу результатов), а затем просто зависает.Я вижу из графического интерфейса администратора MySQL, что состояние «Отправка данных».Я оставил его на час, и он не закончил возвращать результаты или даже перешел с 98K.

Я настроил параметры my.ini для InnoDB, чтобы увеличить innodb_buffer_pool_size до 3Gb (на моей машине есть 4 Гб), но из диспетчера задач видно, что mysqld никогда не использует более 400 Кбайт.

Я создал версию таблицы MyISAM, чтобы проверить, лучше ли это, но также зависаетпримерно столько же возвращенных строк.

Может кто-нибудь подсказать, почему запрос возвращает несколько строк, но затем "зависает", а также то, что я могу сделать, чтобы обойти это и заставить запрос возвращаться, как следует?

Заранее большое спасибо за любую помощь, которую вы можете предложить!

1 Ответ

2 голосов
/ 08 июня 2011

Понятия не имею, почему он зависает, но почему бы вам не попытаться избежать подзапроса с чем-то вроде

select eid, max(transDate) from subscribe group by eid
...