mysql 使用profiling和explain查詢語句性能解析
profiling
MySQL Profile 可以用來收集關(guān)于查詢性能的信息,以便進行性能優(yōu)化。MySQL 查詢 Profile 可以告訴你每個查詢花費了多長時間,使用了多少資源,執(zhí)行了哪些操作等
profiling默認時關(guān)閉,使用以下命令開啟profiling。
mysql> SET profiling = 1;
然后可以使用 SHOW PROFILES;命令來查看sql執(zhí)行耗時。會展示一個列表,其中包含每個查詢的 ID、執(zhí)行時間和內(nèi)存使用情況。
mysql> show profiles; +----------+------------+-----------------------+ | Query_ID | Duration | Query | +----------+------------+-----------------------+ | 1 | 0.00014600 | SELECT DATABASE() | | 2 | 0.00035250 | select * from account | +----------+------------+-----------------------+
如果要查看某個sql的詳細信息,可以使用
SHOW PROFILE FOR QUERY 查詢的Id;查詢的ID就是 SHOW PROFILES展示的列表對應的第一列的值。
mysql> show profile for query 2; +--------------------------------+----------+ | Status | Duration | +--------------------------------+----------+ | starting | 0.000059 | | Executing hook on transaction | 0.000005 | | starting | 0.000009 | | checking permissions | 0.000007 | | Opening tables | 0.000127 | | init | 0.000006 | | System lock | 0.000009 | | optimizing | 0.000004 | | statistics | 0.000015 | | preparing | 0.000021 | | executing | 0.000042 | | end | 0.000004 | | query end | 0.000003 | | waiting for handler commit | 0.000008 | | closing tables | 0.000007 | | freeing items | 0.000010 | | cleaning up | 0.000018 |
在高版本的mysql中,profilling也被提示過時了,被移到performance_schema下一些表中,具體可以看官方介紹
https://dev.mysql.com/doc/refman/8.0/en/performance-schema-query-profiling.html
explain
可以使用explain select語句來查看語句的具體執(zhí)行計劃。它可以顯示 MySQL 查詢優(yōu)化器是如何決定執(zhí)行查詢的。通過執(zhí)行計劃,你可以了解到 MySQL 是如何選擇索引、連接表以及訪問行的順序的。explain展示的計劃結(jié)果列表會有以下列信息。
mysql> explain SELECT * FROM test WHERE id =10; +----+-------------+-------+-------+---------------+---------+---------+-------+------+-------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+-------+---------------+---------+---------+-------+------+-------+ | 1 | SIMPLE | test | const | PRIMARY | PRIMARY | 4 | const | 1 | NULL | +----+-------------+-------+-------+---------------+---------+---------+-------+------+-------+
來看下具體每列大概意思
1、id
表示查詢中執(zhí)行的順序,id相同從上到下按順序執(zhí)行,一般id越大優(yōu)先級越高。如果有子查詢,則子查詢會有不同的 id。子查詢會先執(zhí)行。
2、select_type
SIMPLE:簡單查詢,沒有使用子查詢或連表操作
PRIMARY:復雜查詢中最外層查詢
UNION: union后面的查詢
SUBQUERY: 子查詢
DERIVED: from引用的子查詢
MATERIALIZED: 物化子查詢
例1:
explain SELECT * FROM web_shop_order o inner join web_user u on o.uid=u.uid;
兩個都是簡單查詢:SIMPLE
例2:
EXPLAIN SELECT u.uid,u.username,t.nums FROM web_user u INNER JOIN (SELECT uid,COUNT(1) AS nums FROM web_order2 GROUP BY uid) t ON u.uid=t.uid
最外層的查詢就是:PRIMARY
分組子查詢是:DERIVED
例3:
EXPLAIN SELECT 1 UNION SELECT 2;
會有三條執(zhí)行計劃信息,第一個查詢是:PRIMARY,第二個查詢是UNION,最后的結(jié)果集是UNION RESULT。
3、table列
表名
4、type
表訪問關(guān)聯(lián)類型
- system
表只有一行,是下面const類型的一種特殊情況
const
? 表中最多只有一行記錄匹配,這種就是在where條件中使用主鍵等值查詢
mysql> explain SELECT * FROM web_user where uid=100;
±—±------------±---------±------±--------------±--------±--------±------±-----±------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
±—±------------±---------±------±--------------±--------±--------±------±-----±------+
| 1 | SIMPLE | web_user | const | PRIMARY | PRIMARY | 4 | const | 1 | NULL |
±—±------------±---------±------±--------------±--------±--------±------±-----±------+
- eq_ref
等值關(guān)聯(lián)。對于來自前一個表的每個行組合,從這個表中讀取一行。除了system和const類型之外,這是最好的連接類型。當連接使用索引的所有部分,并且索引是PRIMARY KEY或UNIQUE NOT NULL索引時,使用它。
mysql> explain SELECT * FROM web_shop_order o ,web_user u WHERE o.uid=u.uid; +----+-------------+-------+--------+---------------+---------+---------+--------------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+--------+---------------+---------+---------+--------------+------+-------------+ | 1 | SIMPLE | o | ALL | NULL | NULL | NULL | NULL | 8 | Using where | | 1 | SIMPLE | u | eq_ref | PRIMARY | PRIMARY | 4 | db_xjy.o.uid | 1 | Using where | +----+-------------+-------+--------+---------------+---------+---------+--------------+------+-------------+
?
- ref
普通索引查找。非唯一所有??赡軙祷囟嘈小?/p>
mysql> explain SELECT * FROM web_user WHERE username='張三'; +----+-------------+----------+------+---------------+----------+---------+-------+------+-----------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+----------+------+---------------+----------+---------+-------+------+-----------------------+ | 1 | SIMPLE | web_user | ref | username | username | 63 | const | 1 | Using index condition | +----+-------------+----------+------+---------------+----------+---------+-------+------+-----------------------+
- range
索引范圍掃描,在一個索引列上進行特定范圍進行查找。如in、between and、like、大于或小于等這種。
普通索引也使用。后面的key列對應的使用的索引列。
mysql> explain select * from web_user where uid in(100,101); +----+-------------+----------+-------+---------------+---------+---------+------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+----------+-------+---------------+---------+---------+------+------+-------------+ | 1 | SIMPLE | web_user | range | PRIMARY | PRIMARY | 4 | NULL | 2 | Using where | +----+-------------+----------+-------+---------------+---------+---------+------+------+-------------+ 1 row in set (0.00 sec) mysql> explain select * from web_user where username like '曹%'; +----+-------------+----------+-------+---------------+----------+---------+------+------+-----------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+----------+-------+---------------+----------+---------+------+------+-----------------------+ | 1 | SIMPLE | web_user | range | username | username | 63 | NULL | 9 | Using index condition | +----+-------------+----------+-------+---------------+----------+---------+------+------+-----------------------+ 1 row in set (0.00 sec)
- index
index類型。一般在聯(lián)合索引情況下會使用到。分兩種情況:
1、如果判斷可以使用索引進行條件過濾,走對應索引。Extra列會顯示Using index。
2、索引無法覆蓋所有查詢條件,則走全表掃描。
- ALL
全表掃描。沒什么好說的。沒有走索引。
5、possible_keys
可能使用的索引名稱。
6、index
實際使用的索引。如果沒有選擇使用索引,這一列值為null。有時候肯能possible_keys有值,index為NUll可能數(shù)據(jù)庫任務走索引不如全表掃描快。
7、key_len
使用的索引長度。一個索引可能左值匹配使用了部分,也可能是聯(lián)合索引使用了其中的一部分。
8、ref
這一列顯示了哪些字段或者常量被用來和key列對應索引匹配從表中查詢數(shù)據(jù)。
像前面的等值匹配就是常量,連表就是對應的join列。
9、rows
預估掃描行數(shù)
10、filtered
符合查詢條件的數(shù)據(jù)百分比
11、Extra
mysql是如何執(zhí)行該查詢的額外的信息。前面說的這些列已經(jīng)不能完全表名了。就像前面在說type列為index時,如果使用索引會在Extra有Using index信息。
幾個常見例子:
Using index:使用索引
Using temporary:使用臨時表。一般需要優(yōu)化
Using filesort:使用外部排序,排序字段不是索引列
Using where: 條件過濾
還有很多,可以查看官方文檔https://dev.mysql.com/doc/refman/8.0/en/explain-output.html#explain-extra-information。
到此這篇關(guān)于mysql 使用profiling和explain來分析查詢語句性能的文章就介紹到這了,更多相關(guān)mysql 使用profiling和explain內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
在MySQL數(shù)據(jù)庫之間實現(xiàn)數(shù)據(jù)同步的配置步驟
本文介紹了六種常見的MySQL數(shù)據(jù)同步方法,包括主從復制、雙主復制、群集復制、使用第三方工具(如PerconaXtraBackup)和使用MySQLWorkbench進行數(shù)據(jù)同步,以及編寫自定義腳本進行數(shù)據(jù)同步,每種方法都有其優(yōu)缺點,需根據(jù)實際需求選擇,感興趣的朋友一起看看吧2025-02-02Mysql查詢很慢卡在sending data的原因及解決思路講解
今天小編就為大家分享一篇關(guān)于Mysql查詢很慢卡在sending data的原因及解決思路講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-04-04pycharm2017實現(xiàn)python3.6與mysql的連接
這篇文章主要為大家詳細介紹了PyCharm連接MySQL數(shù)據(jù)庫的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-03-03用MyEclipse配置DataBase Explorer(圖示)
本文介紹了,用MyEclipse配置DataBase Explorer的圖片示例。需要的朋友參考下2013-04-04