В таблице с 5 миллионами строк SELECT count(*) FROM table
будет мгновенным в MyISAM, но займет несколько секунд в InnoDB.
Почему это так? Почему они не оптимизировали подсчет в InnoDB, как MyISAM?
Спасибо.
В таблице с 5 миллионами строк SELECT count(*) FROM table
будет мгновенным в MyISAM, но займет несколько секунд в InnoDB.
Почему это так? Почему они не оптимизировали подсчет в InnoDB, как MyISAM?
Спасибо.
Это разница в реализации. InnoDB поддерживает транзакции, и поэтому он должен подсчитывать строки на основе вашего согласованного с транзакциями представления таблицы (таблиц). Поскольку MyISAM не поддерживает свойства ACID, если строка вставляется, она вставляется для всех, и поэтому она может просто обновить счетчик, хранящийся в механизме хранения.
MyIsam где-то хранит количество строк, поэтому запрос выполняется почти мгновенно, InnoDB должен сканировать таблицу, чтобы получить полный подсчет. Если у вас есть условный подсчет (например: "SELECT COUNT(*) WHERE CUSTOMER =4"), оба должны выполнить сканирование, и в этом случае нет большой разницы.
Источник:
http://www.mysqlperformanceblog.com/2006/12/01/count-for-innodb-tables/