分析查询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(*)
vscount(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)}的字段,那么您将看到性能上的差异