〜9mのレコードを持つ、大きくて狭いInnoDBテーブルがあります。実行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 でパフォーマンスを最適化する方法は何ですか?