我希望能够进行如下计数(这只是一个示例,实际上不会计算狗的数量):
现在的情况是:在我的PhpMyAdmin中,这个查询需要1.8秒(使用
但是,当我删除
这是怎么回事?我该如何使
编辑:下面添加了一个
给我:
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条记录,是一张InnoDB表格,有9列;Colors表格有83条记录,也是InnoDB表格,有两列(id和name)。
*_id列都是主键,我在dogs.race_id和races.color_id的“外键”上建立了索引,并在dogs.deceased上建立了一个索引。所有提到的列都不能为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()
,只执行SELECT *
或SELECT 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 |
+----+-------------+-------+-------+------------------+----------+---------+----------------------+------+-------------+