Почему InnoDB выполняет полное сканирование COUNT(*)?

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

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

Спасибо.


person NeDark    schedule 12.10.2010    source источник
comment
вместо этого: SELECT COUNT(*) FROM [индекс]   -  person arthurprs    schedule 13.10.2010


Ответы (2)


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

person RC.    schedule 12.10.2010
comment
+1 прокрутите вниз и прочитайте сообщение Кена Джейкоба (5) mysqlperformanceblog.com /2007/04/10/count-vs-countcol - person Jon Black; 13.10.2010

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

Источник:

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

person AlePani    schedule 12.10.2010