2011-07-20 97 views
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 |    | 
+---------------+-------------+------+-----+---------+----------------+ 

但是,當我嘗試使用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 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) 

所以,我的第一件事就是: 我能理解這是相同的性能呢?


P/S:MySQL版本是5.5.8。

回答

11

不,你不能。解釋並不能反映mysql所做的所有工作,它只是給你一個如何執行的計劃。

具體如何count(*) vs count(id)。第一個總是不會比第二個慢,在某些情況下速度更快。

count(col)語義是amount of not null values,而count(*)是 - 行數。

大概MySQL能夠通過改寫成count(*)以及優化count(col)id是PK,從而不能NULL(如果不是 - 它看起來最多爲NULLS,這是不是快),但我還是建議你在這樣的使用COUNT(*)案例。

此外 - 內部進程取決於使用的存儲引擎。對於myisam這兩種情況下返回的預先計算的行數(只要您不使用WHERE)。

0

在這個例子中你給出的表現是相同的。

執行計劃顯示,優化程序足夠聰明,可以知道在使用count(*)時它應該使用主鍵來查找總記錄數。

0

計數時沒有顯着差異。原因是大多數優化器會找出自行計算行的最佳方法。

性能差異來搜索值和索引不足。因此,如果您搜索沒有分配索引{f_name,l_name}的字段和{userID(mysql自動使用主鍵上的索引),groupID(看起來像是foraign鍵)的字段},那麼您將看到性能上的差異。