我想做这样的计数(例如,不是真的数狗):
SELECT COUNT(*)
FROM dogs AS d INNER JOIN races AS r ON d.race_id = r.race_id
LEFT INNER colors AS c ON c.color_id = r.color_id
WHERE d.deceased = 'N'
MyISAM 表中有 130,000 条狗。Races 有 1,500 条记录,是一个有 9 列的 InnoDB 表,colors 有 83 条记录,也是 InnoDB,有两列(id、name)。*_id 列都是主键,我在“外”键dogs.race_id 和races.color_id 上有索引,并且在dogs.deased 上有索引。没有提到的列可以是NULL
。
# mysql --version
mysql Ver 14.12 Distrib 5.0.51a, for debian-linux-gnu (i486) using readline 5.2
现在的问题是:在我的 PhpMyAdmin 中,这个查询需要 1.8 秒(带有SQL_NO_CACHE
),计数结果为 64,315。更改COUNT(*)
为COUNT(d.dog_id)
或COUNT(d.deceased)
也使查询运行 1.8 秒,结果相同。
但是当我删除COUNT()
and just do SELECT *
orSELECT dog_id
时,运行大约需要 0.004 秒(然后用类似的东西计算结果mysql_num_rows()
)。
怎么会这样?我怎样才能使COUNT()
工作更快?
编辑:在EXPLAIN
下面添加了
EXPLAIN SELECT COUNT(*)
FROM dogs AS d INNER JOIN races AS r ON d.race_id = r.race_id
INNER JOIN colors AS c ON c.color_id = r.color_id
WHERE d.deceased = 'N'
给我:
+----+-------------+-------+-------+------------------+----------+---------+----------------------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+------------------+----------+---------+----------------------+------+-------------+
| 1 | SIMPLE | c | index | color_id | color_id | 4 | NULL | 83 | Using index |
| 1 | SIMPLE | r | ref | PRIMARY,color_id | color_id | 4 | database.c.color_id | 14 | Using index |
| 1 | SIMPLE | d | ref | race_id,deceased | race_id | 4 | database.r.race_id | 123 | Using where |
+----+-------------+-------+-------+------------------+----------+---------+----------------------+------+-------------+