COUNT (id) запрос занимает слишком много времени, что может помочь в повышении производительности? - PullRequest
1 голос
/ 25 июня 2011

У меня проблема с тайм-аутом запроса.Когда я выполнил:

SELECT COUNT(id) AS rowCount FROM infoTable;

в моей программе, мой вызов JDBC истек через 2,5 минуты.

У меня нет большого опыта администратора базы данных, но в настоящее время мне поручено поддержатьустаревшая база данных.В этой базе данных mysql есть таблица InnoDB:

+-------+------------+------+-----+---------+----------------+
| Field | Type       | Null | Key | Default | Extra          |
+-------+------------+------+-----+---------+----------------+
| id    | bigint(20) | NO   | PRI | NULL    | auto_increment | 
| info  | longtext   | NO   |     |         |                | 
+-------+------------+------+-----+---------+----------------+

В настоящее время ее высокий идентификатор равен 5 192 540, что является приблизительным количеством строк в таблице.Часть информационного текста имеет размер более 1 миллиона, часть очень мала.Ежедневно добавляется около 3000 строк.Машина имеет много свободного дискового пространства, но не так много дополнительной памяти.Строки читаются и иногда изменяются, но редко удаляются, хотя я надеюсь очистить некоторые старые данные, которые в значительной степени устарели.

Я пытался выполнить тот же запрос вручную на небольшой тестовой базе данных, которая имела1 492 669 строк, установленных на аналогичной машине с меньшим объемом дискового пространства, и это заняло 9,19 секунды.

Я попытался выполнить тот же запрос вручную в еще меньшей тестовой базе данных, содержащей 98 629 строк, и это заняло 3,85 секунды.Затем я добавил индекс к id:

create index infoTable_idx on infoTable(id);

, и последующий COUNT занял 4,11 секунды, поэтому не похоже, что добавление индекса поможет в этом случае.(Только для ударов, я сделал то же самое на вышеупомянутой базе данных среднего размера, и время доступа увеличилось с 9,2 до 9,3 секунды.)

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

Спасибо за любой совет, Илан

1 Ответ

4 голосов
/ 25 июня 2011

Вы можете попытаться выполнить следующий оператор объяснения, возможно, это будет немного быстрее:

mysql> EXPLAIN SELECT id FROM table;

Это может дать или не дать более быстрых результатов, ищите поле rows.

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