次のようなテーブルがあります。
| calls | CREATE TABLE `calls` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`request_id` int(10) unsigned NOT NULL,
`ct` int(10) unsigned DEFAULT NULL,
`wt` int(10) unsigned DEFAULT NULL,
`cpu` int(10) unsigned DEFAULT NULL,
`mu` int(10) unsigned DEFAULT NULL,
`pmu` int(10) unsigned DEFAULT NULL,
`caller_id` int(10) unsigned DEFAULT NULL,
`callee_id` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`),
KEY `caller_id` (`caller_id`,`request_id`)
) ENGINE=InnoDB AUTO_INCREMENT=3164057 DEFAULT CHARSET=utf8 |
そして、単純なクエリは次のとおりです。
mysql> EXPLAIN SELECT
-> AVG(`c1`.`wt`) `wt`,
-> AVG(`c1`.`cpu`) `cpu`,
-> AVG(`c1`.`mu`) `mu`,
-> AVG(`c1`.`pmu`) `pmu`
-> FROM
-> `calls` `c1`;
+----+-------------+-------+------+---------------+------+---------+------+---------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+---------+-------+
| 1 | SIMPLE | c1 | ALL | NULL | NULL | NULL | NULL | 3161147 | |
+----+-------------+-------+------+---------------+------+---------+------+---------+-------+
1 row in set (0.00 sec)
mysql> SELECT
-> AVG(`c1`.`wt`) `wt`,
-> AVG(`c1`.`cpu`) `cpu`,
-> AVG(`c1`.`mu`) `mu`,
-> AVG(`c1`.`pmu`) `pmu`
-> FROM
-> `calls` `c1`;
+-----------+----------+------------+------------+
| wt | cpu | mu | pmu |
+-----------+----------+------------+------------+
| 2285.2079 | 428.2061 | 30567.4517 | 24925.7182 |
+-----------+----------+------------+------------+
1 row in set (1.61 sec)
サーバーはかなり高速です (24 GB の RAM)。my.cnf
(完全な my.cnf )の中で最も関連性の高いものは次のとおりです。
query_cache_type=0
query_cache_size=0
key_buffer_size=50M
sort_buffer_size=10M
innodb_buffer_pool_size=1G
read_rnd_buffer_size=1M
join_buffer_size=4M
max_connections=400
table_cache=2000
table_definition_cache=2000
クエリを最適化するためにできることはありますか? 5,278,808 レコードしかないので、ハードウェアの限界に達したとは思えません。
また、テーブル全体を同じテーブルに移動しようとしましたENGINE=MEMORY
。時間は約 30% 改善されました。ただし、それでも遅いです。