Как известно, InnoDB не очень хорош при работе с ключами.
Даже при вызове count() по PRIMARY INDEX – будет сканироватся вся таблица. А при огромном количестве записей – ето очень долго.
Вот один выход из проблемы:
CREATE TABLE `count_index_table` (
`id` int(4) unsigned NOT NULL auto_increment,
`name` char(100) NOT NULL,
`size` bigint(20) unsigned NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
-- Ну очень большая таблица
CREATE TABLE `datatable` (
`id` bigint(20) unsigned NOT NULL auto_increment,
`datalong` varchar(255) default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
CREATE TRIGGER `datatable_before_ins` AFTER INSERT ON `datatable`
FOR EACH ROW
BEGIN
UPDATE count_index_table
SET count_index_table.size = count_index_table.size +1
WHERE count_index_table.name = 'datatable';
END;
CREATE TRIGGER `datatable_after_del` AFTER DELETE ON `count1i`
FOR EACH ROW
BEGIN
UPDATE count_index_table
SET count_index_table.size = count_index_table.size-1
WHERE count_index_table.name = 'datatable';
END;
Источник: http://sql.ru/forum/actualthread.aspx?tid=280049#2535574