欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

mysql 使用profiling和explain查詢語句性能解析

 更新時間:2024年02月09日 09:54:01   作者:曹朋羽  
MySQL 查詢 Profile 可以告訴你每個查詢花費了多長時間,使用了多少資源,執(zhí)行了哪些操作等,這篇文章主要介紹了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ù)庫之間實現(xiàn)數(shù)據(jù)同步的配置步驟

    本文介紹了六種常見的MySQL數(shù)據(jù)同步方法,包括主從復制、雙主復制、群集復制、使用第三方工具(如PerconaXtraBackup)和使用MySQLWorkbench進行數(shù)據(jù)同步,以及編寫自定義腳本進行數(shù)據(jù)同步,每種方法都有其優(yōu)缺點,需根據(jù)實際需求選擇,感興趣的朋友一起看看吧
    2025-02-02
  • CentOS 安裝redis和MySQL

    CentOS 安裝redis和MySQL

    這篇文章主要介紹了CentOS 安裝redis和MySQL的相關(guān)資料,需要的朋友可以參考下
    2019-08-08
  • Mysql查詢很慢卡在sending data的原因及解決思路講解

    Mysql查詢很慢卡在sending data的原因及解決思路講解

    今天小編就為大家分享一篇關(guān)于Mysql查詢很慢卡在sending data的原因及解決思路講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • 經(jīng)典mysql連接查詢例題

    經(jīng)典mysql連接查詢例題

    本文通過一個有趣的例子向我們介紹了mysql連接查詢,采用了子查詢和連接查詢混合和多次連接查詢,需要的朋友可以參考下
    2015-07-07
  • pycharm2017實現(xiàn)python3.6與mysql的連接

    pycharm2017實現(xiàn)python3.6與mysql的連接

    這篇文章主要為大家詳細介紹了PyCharm連接MySQL數(shù)據(jù)庫的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • MySQL?表分區(qū)步驟示例詳解

    MySQL?表分區(qū)步驟示例詳解

    MySQL表分區(qū)是一種數(shù)據(jù)庫管理技術(shù),用于將大型表拆分成更小、更可管理的分區(qū)(子表,這篇文章主要介紹了MySQL?表分區(qū)簡介,需要的朋友可以參考下
    2023-09-09
  • MySQL中MVCC機制的實現(xiàn)原理

    MySQL中MVCC機制的實現(xiàn)原理

    這篇文章主要介紹了MySQL中MVCC機制的實現(xiàn)原理,MVCC多版本并發(fā)控制,MySQL中一種并發(fā)控制的方法,他主要是為了提高數(shù)據(jù)庫的讀寫性能,用更好的方式去處理讀寫沖突
    2022-08-08
  • 淺談如何保證Mysql主從一致

    淺談如何保證Mysql主從一致

    這篇文章主要介紹了淺談如何保證Mysql主從一致
    2022-03-03
  • MySQL回表的性能傷害程度有多大

    MySQL回表的性能傷害程度有多大

    這篇文章主要介紹了MySQL回表的性能傷害程度有多大?下面我們就帶著疑問進入下面文章了解詳細內(nèi)容,需要的小伙伴可以參考一下,希望對你的學習有所幫助
    2022-02-02
  • 用MyEclipse配置DataBase Explorer(圖示)

    用MyEclipse配置DataBase Explorer(圖示)

    本文介紹了,用MyEclipse配置DataBase Explorer的圖片示例。需要的朋友參考下
    2013-04-04

最新評論