我有一个较大但很窄的 InnoDB 表,其中有大约 9m 条记录。做count(*)
或count(id)
在桌子上非常慢(6 秒以上):
DROP TABLE IF EXISTS `perf2`;
CREATE TABLE `perf2` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`channel_id` int(11) DEFAULT NULL,
`timestamp` bigint(20) NOT NULL,
`value` double NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `ts_uniq` (`channel_id`,`timestamp`),
KEY `IDX_CHANNEL_ID` (`channel_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
RESET QUERY CACHE;
SELECT COUNT(*) FROM perf2;
虽然该语句不经常运行,但对其进行优化会很好。根据http://www.cloudspace.com/blog/2009/08/06/fast-mysql-innodb-count-really-fast/这应该可以通过强制 InnoDB 使用索引来实现:
SELECT COUNT(id) FROM perf2 USE INDEX (PRIMARY);
解释计划似乎很好:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE perf2 index NULL PRIMARY 4 NULL 8906459 Using index
不幸的是,声明和以前一样慢。根据“SELECT COUNT(*)”的速度很慢,即使使用 where 子句,我也尝试过优化表但没有成功。
什么/是/重新优化COUNT(*)
InnoDB 性能的方法?