分析查询mysql

时间:2011-07-20 06:40:47

标签: 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    |                |
+---------------+-------------+------+-----+---------+----------------+

但是当我尝试使用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。

3 个答案:

答案 0 :(得分:12)

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

具体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键)}那么您将看到性能上的差异