分析查询mysql

vie*_*ean 4 mysql

我有一个问题,如何分析查询以了解其性能(好的或坏的).我经常搜索并获得如下内容:

SELECT count(*) FROM users; => Many experts said it's bad.

SELECT count(id) FROM users; => Many experts said it's good.

请看表:

+---------------+-------------+------+-----+---------+----------------+
| 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    |                |
+---------------+-------------+------+-----+---------+----------------+
Run Code Online (Sandbox Code Playgroud)

但是当我尝试使用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)
Run Code Online (Sandbox Code Playgroud)

EXPLAIN SELECT count(userId)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)
Run Code Online (Sandbox Code Playgroud)

所以,对我来说第一件事:我 能理解它的表现是否相同?


P/S:MySQL版本是5.5.8.

zer*_*kms 12

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

什么特别count(*)VS count(id).第一个总是不慢于第二个,在某些情况下它更快.

count(col)语义是amount of not null values,虽然count(*)是 - 行数.

可能mysql可以count(col)通过重写进行优化,count(*)因为id它是PK,因此不能NULL(如果不是 - 它查找NULLS,这不是很快),但我仍然建议你COUNT(*)在这种情况下使用.

此外 - 内部进程依赖于使用的存储引擎.对于myisam在两种情况下返回的预先计算的行数(只要您不使用WHERE).