最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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默認(rèn)時關(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的詳細(xì)信息,可以使用

SHOW PROFILE FOR QUERY 查詢的Id;查詢的ID就是 SHOW PROFILES展示的列表對應(yīng)的第一列的值。

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:復(fù)雜查詢中最外層查詢

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類型之外,這是最好的連接類型。當(dāng)連接使用索引的所有部分,并且索引是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

普通索引查找。非唯一所有??赡軙祷囟嘈?。

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列對應(yīng)的使用的索引列。

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、如果判斷可以使用索引進行條件過濾,走對應(yīng)索引。Extra列會顯示Using index。

2、索引無法覆蓋所有查詢條件,則走全表掃描。

  • ALL

全表掃描。沒什么好說的。沒有走索引。

5、possible_keys

可能使用的索引名稱。

6、index

實際使用的索引。如果沒有選擇使用索引,這一列值為null。有時候肯能possible_keys有值,index為NUll可能數(shù)據(jù)庫任務(wù)走索引不如全表掃描快。

7、key_len

使用的索引長度。一個索引可能左值匹配使用了部分,也可能是聯(lián)合索引使用了其中的一部分。

8、ref

這一列顯示了哪些字段或者常量被用來和key列對應(yīng)索引匹配從表中查詢數(shù)據(jù)。

像前面的等值匹配就是常量,連表就是對應(yīng)的join列。

9、rows

預(yù)估掃描行數(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創(chuàng)建和刪除數(shù)據(jù)表的命令及語法詳解

    MySQL創(chuàng)建和刪除數(shù)據(jù)表的命令及語法詳解

    這篇文章主要介紹了MySQL創(chuàng)建和刪除數(shù)據(jù)表的命令及語法,是MySQL入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-11-11
  • MySQL中大對象的多版本并發(fā)控制詳解

    MySQL中大對象的多版本并發(fā)控制詳解

    這篇文章主要給大家介紹了關(guān)于MySQL中大對象的多版本并發(fā)控制的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用mysql具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11
  • my.cnf(my.ini)重要參數(shù)優(yōu)化配置說明

    my.cnf(my.ini)重要參數(shù)優(yōu)化配置說明

    本文針對mysql不同存儲引擎,MyISAM與Innodb進行了講解如何進行my.cnf(my.ini)的參數(shù)優(yōu)化
    2018-03-03
  • windows下mysql數(shù)據(jù)庫主從配置教程

    windows下mysql數(shù)據(jù)庫主從配置教程

    這篇文章主要為大家詳細(xì)介紹了windows下mysql數(shù)據(jù)庫主從配置教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • MySQL中WITH用法小結(jié)

    MySQL中WITH用法小結(jié)

    WITH子句是MySQL中的一種SQL結(jié)構(gòu),本文主要介紹了MySQL中WITH用法小結(jié),具有一定的參考價值,感興趣的可以了解一下
    2023-10-10
  • 高效數(shù)據(jù)流轉(zhuǎn):Mycat分庫分表與GreatSQL實時同步

    高效數(shù)據(jù)流轉(zhuǎn):Mycat分庫分表與GreatSQL實時同步

    聚焦數(shù)據(jù)庫擴容與實時數(shù)據(jù)同步,探索MyCat分庫分表與GreatSQL的強大結(jié)合!想在大規(guī)模數(shù)據(jù)處理中游刃有余?本指南將帶你輕松掌握MyCat的分布式解決方案和GreatSQL的實時同步機制,讓高效、穩(wěn)定的數(shù)據(jù)庫管理觸手可及,一起揭開高并發(fā)環(huán)境下數(shù)據(jù)庫優(yōu)化的神秘面紗吧!
    2024-01-01
  • MySQL中表復(fù)制:create table like 與 create table as select

    MySQL中表復(fù)制:create table like 與 create table as select

    這篇文章主要介紹了MySQL中表復(fù)制:create table like 與 create table as select,需要的朋友可以參考下
    2014-12-12
  • 從MySQL復(fù)制功能中得到的一舉三得實惠分析

    從MySQL復(fù)制功能中得到的一舉三得實惠分析

    在MySQL數(shù)據(jù)庫中,支持單項、異步復(fù)制。在復(fù)制過程中,一個服務(wù)器充當(dāng)主服務(wù)器,而另外一臺服務(wù)器充當(dāng)從服務(wù)器。筆者通過MySQL的復(fù)制功能得到了一下實惠,在下文中與大家分享。
    2011-03-03
  • mysql模糊匹配多個值的兩種方法實例

    mysql模糊匹配多個值的兩種方法實例

    我們平時使用msyql需要模糊的匹配字段的時候,我們第一反應(yīng)就是使用like查詢語句來模糊匹配,下面這篇文章主要給大家介紹了關(guān)于mysql模糊匹配多個值的兩種方法,需要的朋友可以參考下
    2022-12-12
  • MySQL利用profile分析慢sql詳解(group left join效率高于子查詢)

    MySQL利用profile分析慢sql詳解(group left join效率高于子查詢)

    最近因為一個用了子查詢的sql語句查詢很慢,嚴(yán)重影響了性能,所以需要進行優(yōu)化,下面這篇文章主要跟大家介紹了關(guān)于MySQL利用profile分析慢sql的相關(guān)資料,文中介紹的非常詳細(xì),需要的朋友們可以參考借鑒,下面來一起看看吧。
    2017-03-03

最新評論

石景山区| 获嘉县| 盐津县| 集贤县| 晋州市| 吴旗县| 阿拉善盟| 墨玉县| 龙门县| 龙胜| 句容市| 景泰县| 靖宇县| 松溪县| 大丰市| 黑水县| 平塘县| 桐梓县| 吴堡县| 长海县| 宜兰县| 镇坪县| 松滋市| 宣城市| 富民县| 大余县| 义马市| 阳曲县| 延川县| 南丰县| 东城区| 泸州市| 静乐县| 宜宾市| 齐齐哈尔市| 财经| 西林县| 任丘市| 绵阳市| 山阴县| 文登市|