Почему InnoDB выполняет полное сканирование на COUNT (*)? - PullRequest
2 голосов
/ 13 октября 2010

В таблице с 5 миллионами строк значение SELECT count(*) FROM table будет мгновенным в MyISAM, но в InnoDB займет несколько секунд.

Почему это так?Почему они не оптимизируют счет в InnoDB, как MyISAM?

Спасибо.

Ответы [ 2 ]

6 голосов
/ 13 октября 2010

MyIsam хранит количество строк, хранящихся где-то, поэтому запрос выполняется практически мгновенно, InnoDB должен сканировать таблицу, чтобы получить полный счет. Если у вас есть условный счет (например: «SELECT COUNT (*) WHERE CUSTOMER = 4»), оба должны выполнить сканирование, и в этом случае нет большой разницы

Источник:

http://www.mysqlperformanceblog.com/2006/12/01/count-for-innodb-tables/

6 голосов
/ 13 октября 2010

Это разница в реализации.InnoDB поддерживает транзакции и, следовательно, он должен подсчитывать строки на основе вашего транзакционно согласованного представления таблиц.Поскольку MyISAM не поддерживает свойства ACID, если строка вставлена, она вставляется для всех, и поэтому она может просто обновить счетчик, который хранится в механизме хранения.

...