MySQL - Сложность: SELECT COUNT (*) FROM MyTable; - PullRequest
10 голосов
/ 10 марта 2011

Какова сложность этого запроса MySQL

SELECT COUNT(*) FROM MyTable;

Сохраняется ли где-то число записей в таблице, где-то хранится и обновляется каждый раз, когда строка вставляется или удаляется?Если это так, то сложность должна быть O (1).

Ответы [ 3 ]

10 голосов
/ 10 марта 2011

Это зависит от механизма хранения.

  • Для MyISAM общее количество строк сохраняется для каждой таблицы, поэтому SELECT COUNT(*) FROM yourtable является операцией O (1).Просто нужно прочитать это значение.
  • Для InnoDB общее количество строк не сохраняется, поэтому требуется полное сканирование.Это операция O (n).

Из руководства :

InnoDB не ведется внутренний подсчет строк вТаблица.(На практике это было бы несколько сложно из-за множественного управления версиями.) Чтобы обработать оператор SELECT COUNT(*) FROM t, InnoDB должен сканировать индекс таблицы, что занимает некоторое время, если индекс не полностью находится в пуле буферов.Если ваша таблица не меняется часто, использование кэша запросов MySQL является хорошим решением.Чтобы получить быстрый счет, вы должны использовать созданную вами таблицу счетчиков и позволить своему приложению обновлять ее в соответствии со вставками и удалять.SHOW TABLE STATUS также можно использовать, если достаточно приблизительного количества строк.См. Раздел 13.2.13.1, «InnoDB Советы по настройке производительности ».

1 голос
/ 10 марта 2011

AFAIK в MyISAM-счетчиках строк кэшируется, в InnoDB нет, и при каждом count-all он считает все строки.

0 голосов
/ 10 марта 2011

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

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