您好,登錄后才能下訂單哦!
這篇文章主要講解了“MySQL explain中的rows是如何計算的”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“MySQL explain中的rows是如何計算的”吧!
【背景鋪墊】
相關表:
CREATE TABLE test_table ( id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT, name varchar(32) NOT NULL, PRIMARY KEY (id)) ENGINE = InnoDB CHARSET = utf8mb4;
test_table 表記錄數約12w+
相關SQL:
EXPLAIN SELECT COUNT(*)
FROM test_table
WHERE id >= 10534
AND id <= 15375;
疑問1:上述SQL理應按id主鍵(聚簇索引)范圍查找,為啥explain里的rows會多余兩者之差呢?
在SQL結尾處增加 LIMIT 10 后,rows數值竟然沒有任何影響(覺得可能會變為: 10)。
EXPLAIN SELECT COUNT(*)
FROM test_table
WHERE id >= 10000
LIMIT 10;
疑問2:LIMIT值不會影響rows的值么?
這個rows在官網文檔中的解釋如下:
rows (JSON name: rows)
The rows column indicates the number of rows MySQL believes it must examine to execute the query.
For [InnoDB] tables, this number is an estimate, and may not always be exact.
http://dev.mysql.com/doc/refman/5.7/en/explain-output.html#explain_rows
簡單理解即:這個rows就是mysql認為估計需要檢測的行數。
為了探究rows究竟是如何算出來的,查找MYSQL源碼來看看:
文件1:sql/opt_explain_traditional.cc 關鍵部分:push(&items, column_buffer.col_rows, nil)文件2:sql/opt_explain.cc 關鍵部分:select->quick->records文件3:sql/opt_range.cc 關鍵部分:check_quick_select
而check_quick_select的功能,在MySQL源碼中的注釋為:
簡單翻譯就是:這個方法僅僅根據給出的關于這個索引的條件和索引本身,來判斷需要掃描多少行。
總結
感謝各位的閱讀,以上就是“MySQL explain中的rows是如何計算的”的內容了,經過本文的學習后,相信大家對MySQL explain中的rows是如何計算的這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。