1. 程式人生 > >MySQL通過Explain檢視select語句的執行計劃結果觸發寫操作

MySQL通過Explain檢視select語句的執行計劃結果觸發寫操作

背景

  某某同學執行了一下Explain結果結果發現數據庫有了一條寫入操作,恭喜這位同學你的鍋到貨了,你簽收一下;

  對! 你沒有聽錯,在一種場景下就算是Explain也會引發資料的寫操作,就這是外層查詢訪問任意表,內層查詢呼叫function

  在function有寫入動作的情況下會發生寫入。

硬生生的套上一個場景

  假設我們有一個Person表,每訪問一次Person表都記錄一次在什麼時候,訪問了哪一行,表結構設計如下

create table if not exists person(
    id int not null auto_increment primary
key, name varchar(16) ); create table if not exists person_opration_log( id int not null auto_increment primary key, pid int not null, access_datetime datetime ); delimiter // create function fun_person_log(pid int) returns int begin insert into person_opration_log(pid,access_datetime) values
(pid,now()); return pid; end // delimiter ;

  正常的資料訪問SQL如下,但是它並不寫日誌

mysql> select
    ->     id,
    ->     name 
    -> from person 
    -> where id = 1;
+----+--------+
| id | name   |
+----+--------+
|  1 | 項羽   |
+----+--------+
1 row in set (0.00 sec)

  如果我們要寫日誌可以分兩步走,先訪問再計一筆日誌

mysql> select
    ->     id,
    ->     name 
    -> from person 
    -> where id = 1;
+----+--------+
| id | name   |
+----+--------+
|  1 | 項羽   |
+----+--------+
1 row in set (0.00 sec)

mysql> 
mysql> select fun_person_log(1);
+-------------------+
| fun_person_log(1) |
+-------------------+
|                 1 |
+-------------------+
1 row in set (0.05 sec)

mysql> 
mysql> select * from person_opration_log ;
+----+-----+---------------------+
| id | pid | access_datetime     |
+----+-----+---------------------+
|  1 |   1 | 2018-10-06 17:12:31 |
+----+-----+---------------------+
1 row in set (0.00 sec)

牛人想出的新點子把兩步合成一步

  牛人的新點子

mysql> select 
    ->     fun_person_log(100) as id , 
    ->     name
    -> from person
    -> where id = (select fun_person_log(100));
Empty set (0.04 sec)

mysql> 
mysql> select * from person_opration_log;
+----+-----+---------------------+
| id | pid | access_datetime     |
+----+-----+---------------------+
|  1 |   1 | 2018-10-06 17:12:31 |
|  2 | 100 | 2018-10-06 17:15:29 |
+----+-----+--------------------

  牛人的新點子剛好入坑,我們可以explain一下

mysql> explain select 
    ->     fun_person_log(250) as id , 
    ->     name
    -> from person
    -> where id = (select fun_person_log(250));
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+--------------------------------+
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra                          |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+--------------------------------+
|  1 | PRIMARY     | NULL  | NULL       | NULL | NULL          | NULL | NULL    | NULL | NULL |     NULL | no matching row in const table |
|  2 | SUBQUERY    | NULL  | NULL       | NULL | NULL          | NULL | NULL    | NULL | NULL |     NULL | No tables used                 |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+--------------------------------+
2 rows in set, 1 warning (0.08 sec)

mysql> 
mysql> select * from person_opration_log;
+----+-----+---------------------+
| id | pid | access_datetime     |
+----+-----+---------------------+
|  1 |   1 | 2018-10-06 17:12:31 |
|  2 | 100 | 2018-10-06 17:15:29 |
|  3 | 250 | 2018-10-06 17:17:23 |
+----+-----+---------------------+
3 rows in set (0.00 sec)

  看吧! explain引發了寫入操作!

參考連線

學習交流

 -----------------------------http://www.sqlpy.com-------------------------------------------------

 -----------------------------http://www.sqlpy.com-------------------------------------------------

相關推薦

MySQL通過Explain檢視select語句執行計劃結果觸發操作

【背景】   某某同學執行了一下Explain結果結果發現數據庫有了一條寫入操作,恭喜這位同學你的鍋到貨了,你簽收一下;   對! 你沒有聽錯,在一種場景下就算是Explain也會引發資料的寫操作,就這是外層查詢訪問任意表,內層查詢呼叫function   在function有寫入動作的情況下會發生寫入。

MySQL通過Explain查看select語句執行計劃結果觸發操作

fun 學習交流 target emp tables HERE 背景 一次 time 【背景】   某某同學執行了一下Explain結果結果發現數據庫有了一條寫入操作,恭喜這位同學你的鍋到貨了,你簽收一下;   對! 你沒有聽錯,在一種場景下就算是Explain也會引發

MySQL——通過EXPLAIN分析SQL的執行計劃

_id ble custom sql遍歷 extra clas soft sql tom 在MySQL中,我們可以通過EXPLAIN命令獲取MySQL如何執行SELECT語句的信息,包括在SELECT語句執行過程中表如何連接和連接的順序。 下面分別對EXPLAIN命令結果

mysql優化–explain分析sql語句執行效率

  Explain命令在解決資料庫效能上是第一推薦使用命令,大部分的效能問題可以通過此命令來簡單的解決,Explain可以用來檢視SQL語句的執行效 果,可以幫助選擇更好的索引和優化查詢語句,寫出更好的優化語句。 Explain語法:explain select … from …

SELECT TOP 1 比不加TOP 1 慢的原因分析以及SELECT TOP 1語句執行計劃預估原理

create p s 總結 字段 不用 value tar 再次 char   現實中遇到過到這麽一種情況:   在某些特殊場景下:進行查詢的時候,加了TOP 1比不加TOP 1要慢(而且是慢很多)的情況,   也就是說對於符合條件的某種的數據,查詢1條(符合該條件)數據比

MySQL中使用explain查詢SQL的執行計劃

inter 好的 ref index subquery plain 匹配 文件 pos 1、什麽是MySQL執行計劃 要對執行計劃有個比較好的理解,需要先對MySQL的基礎結構及查詢基本原理有簡單的了解。 MySQL本身的功能架構分為三個部分

MySQL檢視SQL語句執行效率

原文:https://www.cnblogs.com/balala/p/5601308.html Explain命令在解決資料庫效能上是第一推薦使用命令,大部分的效能問題可以通過此命令來簡單的解決,Explain可以用來檢視 SQL 語句的執行效 果,可以幫助選擇更好的

Mysql explain分析sql語句執行效率

mysql優化–explain分析sql語句執行效率 Explain命令在解決資料庫效能上是第一推薦使用命令,大部分的效能問題可以通過此命令來簡單的解決,Explain可以用來檢視SQL語句的執行效 果,可以幫助選擇更好的索引和優化查詢語句,寫出更好的優化語句。 Explain語法:explain sel

mysql 如何檢視sql語句執行時間和效率

檢視執行時間 1 show profiles; 2 show variables;檢視profiling 是否是on狀態; 3 如果是off,則 set profiling = 1; 4 執行自己的sql語句; 5 show profiles;就可以查

mysql優化(三)–explain分析sql語句執行效率

mushu 釋出於 11個月前 (06-04) 分類:Mysql 閱讀(651) 評論(0) Explain命令在解決資料庫效能上是第一推薦使用命令,大部分的效能問題可以通過此命令來簡單的解決,Explain可以用來檢視SQL語句的執行效 果,可以幫助選擇更好的索引和優化查詢語句,寫出

mysql order by 造成語句 執行計劃中Using filesort,Using temporary相關語句的優化解決

mysql> explain  select permission.* from t_rbac_permission   permission  inner JOIN  t_rbac_acl  acl  on acl.PERMISSION_ID=permissio

使用Explain分析select語句

explainexplain可以分析某條select語句會查詢多少條記錄、以怎樣的方式查詢,以及復雜select的執行順序,借此可以了解到select語句的性能和查詢是如何執行的如: select子句和from子句,先執行from子句ps: 我們的服務器上mysql版本是5.1.73,mysql 5.6 ex

mysql 如何查看sql語句執行時間和效率

訪問 執行時間 subquery ber 如果 pan from xtra 重要 查看執行時間 1 show profiles; 2 show variables;查看profiling 是否是on狀態; 3 如果是off,則 set profiling = 1; 4 執

MySQL學習----explain檢視一條sql 的效能

在開發的過程中,對於我們寫的sql語句,我們有時候會考慮sql語句的效能,那麼explain就是首選。Explain命令在解決資料庫效能上是第一推薦使用命令,大部分的效能問題可以通過此命令來簡單的解決,Explain可以用來檢視 SQL 語句的執行效 果,可以幫助選擇更好的索引和優化查詢語

mysql基礎架構之查詢語句執行流程

這篇筆記主要記錄mysql的基礎架構,一條查詢語句是如何執行的。 比如,在我們從student表中查詢一個id=2的資訊 select * from student where id=2; 在解釋這條語句執行流程之前,我們看看mysql的基礎架構。 圖來自極客時間的mysql實踐,該圖是描述的是M

ORACLE中查詢語句執行順及where部分條件執行順序測試 Oracle中的一些查詢語句及其執行順序 Select 語句執行順序以及如何提高Oracle 基本查詢效率

Oracle中的一些查詢語句及其執行順序 原文地址:https://www.cnblogs.com/likeju/p/5039115.html 查詢條件:1)LIKE:模糊查詢,需要藉助兩個萬用字元,%:表示0到多個字元;_:標識單個字元。2)IN(list):用來取出符合列表範圍中的資料。3)NOT I

mysql資料庫學習08-select語句的使用

1、where子句: = 等於 <>不等 >=大於等於 <=小於等於 between 小值 and 大值   閉區間範圍 in(1,2,3)  在列舉範圍內的 is not null  非空null is

mysql通過日期查詢 sq語句

今天 select * from 表名 where to_days(時間欄位名) = to_days(now()); 昨天 SELECT * FROM 表名 WHERE TO_DAYS( NOW( ) ) - TO_DAYS( 時間欄位名) <= 1 7天

Oracle select語句執行順序

最近在公司實習剛好需要用到oracle,作為之前沒有碰過oracle的我經常碰壁,而其中一個就是不是很瞭解其執行語句的順序,導致經常出現以下“靈異”的現象,比如用group by進行分組,結果出現多個相同的組,最後才發現是因為我在select裡使用了別名,而or

Explain分析sql語句執行效率

使用Explain命令會有以下屬性輸出:        1》id:這是SELECT的查詢序列號        2》select_type:select_type就是select的型別:   &n