分析查询mysql

分析查询mysql,mysql,Mysql,我有一个问题,关于如何分析查询以了解其性能(好或坏)。 我搜索了很多,得到了如下信息: SELECT count(*)FROM users;=>许多专家说这很糟糕。 从用户中选择计数(id);=>许多专家说这很好。 请参见下表: +---------------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra

我有一个问题,关于如何分析查询以了解其性能(好或坏)。 我搜索了很多,得到了如下信息:

SELECT count(*)FROM users;=>许多专家说这很糟糕。

从用户中选择计数(id);=>许多专家说这很好。

请参见下表:

+---------------+-------------+------+-----+---------+----------------+
| Field         | Type        | Null | Key | Default | Extra          |
+---------------+-------------+------+-----+---------+----------------+
| userId        | int(11)     | NO   | PRI | NULL    | auto_increment |
| f_name        | varchar(50) | YES  |     | NULL    |                |
| l_name        | varchar(50) | YES  |     | NULL    |                |
| user_name     | varchar(50) | NO   |     | NULL    |                |
| password      | varchar(50) | YES  |     | NULL    |                |
| email         | varchar(50) | YES  |     | NULL    |                |
| active        | char(1)     | NO   |     | Y       |                |
| groupId       | smallint(4) | YES  | MUL | NULL    |                |
| created_date  | datetime    | YES  |     | NULL    |                |
| modified_date | datetime    | YES  |     | NULL    |                |
+---------------+-------------+------+-----+---------+----------------+
但当我尝试使用
EXPLAIN
命令进行解释时,我得到了以下结果:

EXPLAIN SELECT count(*) FROM `user`;

+----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+
| id | select_type | table | type  | possible_keys | key     | key_len | ref  | rows | Extra       |
+----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+
|  1 | SIMPLE      | user  | index | NULL          | groupId | 3       | NULL |   83 | Using index |
+----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+
1 row in set (0.00 sec)
解释从
user
中选择计数(
userId

+----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+
| id | select_type | table | type  | possible_keys | key     | key_len | ref  | rows | Extra       |
+----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+
|  1 | SIMPLE      | user  | index | NULL          | groupId | 3       | NULL |   83 | Using index |
+----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+
1 row in set (0.00 sec)
所以,对我来说,第一件事: 我能理解这是相同的性能吗?



p/S:MySQL版本是5.5.8。

不,您不能。Explain并没有反映mysql所做的所有工作,它只是给你一个如何执行的计划

具体来说,
count(*)
vs
count(id)
。第一个总是不比第二个慢,而且在某些情况下它更快

count(col)
语义是
非空值的数量
,而
count(*)
是-行的数量

也许mysql可以通过重写成
count(*)
来优化
count(col)
,并且
id
是一个PK,因此不能
NULL
(如果不是-它查找
NULL
,这不是很快),但我仍然建议您在这种情况下使用
count(*)


此外,内部进程取决于使用的存储引擎。对于
myisam
,在这两种情况下返回的预先计算的行数(只要不使用
WHERE
)。

在您给出的示例中,性能是相同的


执行计划向您表明,优化者足够聪明,知道在使用count(*)时,它应该使用主键来查找记录总数。

在计数时没有显著差异。原因是大多数优化器都会找到自己计算行数的最佳方法

性能差异在于搜索值和缺少索引。因此,如果您搜索一个没有索引分配{f_name,l_name}的字段和一个有{userID(mysql自动在主键上使用索引)、groupID(看起来像foraign key)}的字段,那么您将看到性能上的差异