gpt4 book ai didi

mysql - 正常选择比 count(*) 快

转载 作者:可可西里 更新时间:2023-11-01 07:40:28 25 4
gpt4 key购买 nike

我想做这样的计数(例如,不是真的数狗):

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.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 |
+----+-------------+-------+-------+------------------+----------+---------+----------------------+------+-------------+

最佳答案

MySQL 优化器仅在需要时才进行全表扫描,因为列可以为 NULL,这意味着如果列未定义为 NOT NULL,则其中可能有一些 NULL 值,因此 MySQL 必须执行表扫描以查出。如果您的列 d.dog_id 可以为空?尝试在另一个不可为空的列上运行计数,这应该为您提供比 count(*) 更好的性能。

关于mysql - 正常选择比 count(*) 快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15898642/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com