我有一个问题,如何分析查询以了解其性能(好的或坏的).我经常搜索并获得如下内容:
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).
| 归档时间: |
|
| 查看次数: |
7244 次 |
| 最近记录: |