簡體   English   中英

分析查詢 mysql

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM