[英]analyze query 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)
解釋 SELECT 計數( userId
)來自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。
你不能。 解釋並沒有反映 mysql 所做的所有工作,它只是為您提供了如何執行的計划。
具體count(*)
vs count(id)
怎么樣。 第一個總是不比第二個慢,在某些情況下它更快。
count(col)
語義是非amount of not null values
,而count(*)
是 - 行數。
可能 mysql 可以通過重寫為count(*)
來優化count(col)
以及id
是一個 PK 因此不能是NULL
(如果不是 - 它查找NULLS
,這並不快),但我仍然建議你使用COUNT(*)
在這種情況下。
此外 - 內部流程取決於使用的存儲引擎。 對於myisam
,在兩種情況下都返回預先計算的行數(只要您不使用WHERE
)。
在您給出的示例中,性能是相同的。
執行計划向您展示了優化器足夠聰明,知道在您使用 count(*) 時它應該使用主鍵來查找記錄總數。
計數時沒有顯着差異。 原因是大多數優化器會自己找出計算行數的最佳方法。
性能差異在於搜索值和缺乏索引。 因此,如果您搜索一個沒有分配索引的字段 {f_name,l_name} 和一個具有 {userID(mysql 自動在主鍵上使用索引),groupID(似乎是外鍵)} 的字段,那么您將看到性能上的差異.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.