真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

MySQL中explain如何使用

這篇文章將為大家詳細講解有關(guān)MySQL中explain如何使用,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。

創(chuàng)新互聯(lián)主營靖宇網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,重慶APP軟件開發(fā),靖宇h5成都微信小程序搭建,靖宇網(wǎng)站營銷推廣歡迎靖宇等地區(qū)企業(yè)咨詢

首先是一個比較實際的用法,查詢語句我們可以查看執(zhí)行計劃,如果是DML語句呢,他是直接變更了還是只是生成執(zhí)行計劃而已,明白這一點很重要。

explain 生成DML的執(zhí)行計劃

為了進一步的驗證,我們選擇3個版本,5.5,5.6,5.7來測試。

首先是初始化數(shù)據(jù),這個在不同版本是一模一樣的方式。

創(chuàng)建一個表test,插入兩行數(shù)據(jù)。

> create table test(id int,name varchar(20));
Query OK, 0 rows affected (0.01 sec)
> insert into test values(1,'aa'),(2,'bb');
Query OK, 2 rows affected (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 0

MySQL 5.5

來看看DML語句的執(zhí)行計劃情況,發(fā)現(xiàn)是不支持的。

> explain insert into test values(3,'cc');
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'insert into test values(3,'cc')' at line 1
換一個DML比如update,也是不支持的。

> explain update test set name='cc' where id=2;

在此,我們不能得出一個不支持DML的最終結(jié)論,我們看看5.6,5.7的結(jié)果。

MySQL 5.6
5.6中的結(jié)果來看,是支持的,那么最關(guān)心的問題,數(shù)據(jù)會不會變更呢。

> explain insert into test values(3,'cc');
+----+-------------+-------+------+---------------+------+---------+------+------+----------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra          |
+----+-------------+-------+------+---------------+------+---------+------+------+----------------+
|  1 | SIMPLE      | NULL  | NULL | NULL          | NULL | NULL    | NULL | NULL | No tables used |
+----+-------------+-------+------+---------------+------+---------+------+------+----------------+
1 row in set (0.00 sec)

查一下數(shù)據(jù)一目了然。

> select *from test;
+------+------+
| id   | name |
+------+------+
|    1 | aa   |
|    2 | bb   |
+------+------+
2 rows in set (0.00 sec)而換一個DML,比如update也是類似的效果。不會直接修改數(shù)據(jù)。

MySQL 5.7

在5.7中又做了一些改變,那就是對于DML的支持更加完善了,你可以通過語句的執(zhí)行計劃可以很清晰的看到是哪一種類型的DML(insert,update,delete),當(dāng)然insert的執(zhí)行計劃有些雞肋,因為實在沒什么好處理的了。

> explain insert into test values(3,'cc');
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+
|  1 | INSERT      | test  | NULL       | ALL  | NULL          | NULL | NULL    | NULL | NULL |     NULL | NULL  |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+

那看看update的執(zhí)行計劃,可以看出,在當(dāng)前的表結(jié)構(gòu)情況下,這個語句的執(zhí)行效率還是十分有限。

> explain update test set name='cc' where id=2;
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra       |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
|  1 | UPDATE      | test  | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    2 |   100.00 | Using where |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+很明顯,這個過程是不會修改數(shù)據(jù)的。

> select *from test;
+------+------+
| id   | name |
+------+------+
|    1 | aa   |
|    2 | bb   |
+------+------+

explain for connection的新特性

如果對于explain開始有了一些感覺,那么我們再來看一個5.7中的新特性,那就是對connection的解析,也就是explain for connection特性。

  我們假設(shè)一個場景,有一個SQL語句執(zhí)行效率很差,我們通過show processlist可以看到,但是語句的效率為什么這么差呢,一個行之有效的分析問題的方法就是查看執(zhí)行計劃,好了,回到問題的核心,那就是怎么得到語句的執(zhí)行計劃,這個如果我們按照現(xiàn)有問題的處理方式,那就是查看慢日志,然后再解析。或者使用第三方的工具,來得到一些效果更好一些的報告。

   比較糾結(jié)的一種情況,就是你看到語句的執(zhí)行效率很差,但是這么一個過程下來少說也有幾分鐘,等你快解析出來的時候,發(fā)現(xiàn)語句已經(jīng)返回了。所以實時抓取數(shù)據(jù)是提升DBA幸福度的一大利器。那我們就模擬一個性能較差的SQL,比如下面的反連接語句,執(zhí)行效率很差。我們來試著抓取一下執(zhí)行計劃。

> select account
  from t_fund_info
 where money >= 300
   and account not in (select distinct (account)
                         from t_user_login_record
                        where add_time >= '2016-06-01');

我們通過mysqladmin pro的方式抓取會話的情況,類似于show processlist的結(jié)果,可以很明顯看到第一列就是connection id  6346185,我們解析一下這個connection

# mysqladmin pro|grep t_fund_info
| 6346185 | root            | localhost                   | test           | Query       | 8       | Sending data                                                  | select account   from t_fund_info  where money >= 300  and account not in (select distinct (account) | 0         | 0             |

查看執(zhí)行計劃的情況如下:

> explain for connection 6346185;
+----+-------------+---------------------+------------+------+---------------+------+---------+------+---------+---------
| id | select_type | table               | partitions | type | possible_keys | key  | key_len | ref  | rows    | filtered
+----+-------------+---------------------+------------+------+---------------+------+---------+------+---------+---------
|  1 | PRIMARY     | t_fund_info         | NULL       | ALL  | NULL          | NULL | NULL    | NULL | 1826980 |   100.00
|  2 | SUBQUERY    | t_user_login_record | NULL       | ALL  | NULL          | NULL | NULL    | NULL | 1740589 |    33.33
+----+-------------+---------------------+------------+------+---------------+------+---------+------+---------+---------

關(guān)于MySQL中explain如何使用就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。


標(biāo)題名稱:MySQL中explain如何使用
文章位置:http://weahome.cn/article/gsehcj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部