我有一个问题,如何分析查询以了解其性能(好的或坏的)。 我经常搜索并得到如下内容:
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 | |
+---------------+-------------+------+-----+---------+----------------+
但是当我尝试使用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)
EXPLAIN SELECT计数(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)
所以,对我来说第一件事: 我能理解它的表现是否相同?
P / S:MySQL版本是5.5.8。
答案 0 :(得分:12)
具体count(*)
vs count(id)
怎么样?第一个总是不慢于第二个,在某些情况下它更快。
count(col)
语义为amount of not null values
,而count(*)
为 - 行数。
可能mysql可以通过重写count(col)
来优化count(*)
,而id
是PK,因此不能NULL
(如果不是 - 它会查找{{1}这不快,但我还是建议你在这种情况下使用NULLS
。
此外 - 内部进程依赖于已使用的存储引擎。对于COUNT(*)
,在两种情况下都会返回预先计算的行数(只要您不使用myisam
)。
答案 1 :(得分:1)
在示例中,您给出的表现是相同的。
执行计划向您显示优化器足够聪明,知道它应该使用主键来查找使用count(*)时的记录总数。
答案 2 :(得分:0)
计数时没有显着差异。原因是大多数优化器都会找出自己计算行数的最佳方法。
性能差异来自于搜索价值和缺乏索引。因此,如果您搜索没有分配{f_name,l_name}索引的字段以及具有{userID(mysql自动使用主键索引)的字段,groupID(似乎是foraign键)}那么您将看到性能上的差异