成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何利用工具,迅猛定位低效SQL? | 1分鐘系列

開發 開發工具 MySQL
其實,explain結果中還有一個Extra字段,對分析與優化SQL有很大的幫助,今天花1分鐘簡單和大家聊一聊。

兩個案例分析,展現了MySQL性能分析工具explain的強大。

同一個SQL語句,為啥性能差異咋就這么大呢?

詳細敘述了explain結果中最重要的type字段(連接類型)的含義。

其實,explain結果中還有一個Extra字段,對分析與優化SQL有很大的幫助,今天花1分鐘簡單和大家聊一聊。

數據準備:

  1. create table user ( 
  2. id int primary key, 
  3. name varchar(20), 
  4. sex varchar(5), 
  5. index(name) 
  6. )engine=innodb
  7.   
  8. insert into user values(1, 'shenjian','no'); 
  9. insert into user values(2, 'zhangsan','no'); 
  10. insert into user values(3, 'lisi', 'yes'); 
  11. insert into user values(4, 'lisi', 'no'); 

數據說明:

  • 用戶表:id主鍵索引,name普通索引(非唯一),sex無索引;
  • 四行記錄:其中name普通索引存在重復記錄lisi;

實驗目的:

通過構造各類SQL語句,對explain的Extra字段進行說明,啟發式定位待優化低性能SQL語句。

一、【Using where】

實驗語句:

  1. explain select * from user where sex='no'

結果說明:

Extra為Using where說明,SQL使用了where條件過濾數據。

需要注意的是:

  • 返回所有記錄的SQL,不使用where條件過濾數據,大概率不符合預期,對于這類SQL往往需要進行優化;
  • 使用了where條件的SQL,并不代表不需要優化,往往需要配合explain結果中的type(連接類型)來綜合判斷;

畫外音:join type在《同一個SQL語句,為啥性能差異咋就這么大呢?》一文中有詳細敘述,本文不再展開。

本例雖然Extra字段說明使用了where條件過濾,但type屬性是ALL,表示需要掃描全部數據,仍有優化空間。

常見的優化方法為,在where過濾屬性上添加索引。

畫外音:本例中,sex字段區分度不高,添加索引對性能提升有限。

二、【Using index】

實驗語句:

  1. explain select id,name from user where name='shenjian'

結果說明:

Extra為Using index說明,SQL所需要返回的所有列數據均在一棵索引樹上,而無需訪問實際的行記錄。

畫外音:The column information is retrieved from the table using only information in the index tree without having to do an additional seek to read the actual row.

這類SQL語句往往性能較好。

問題來了,什么樣的列數據,會包含在索引樹上呢?

三、【Using index condition】

實驗語句:

  1. explain select id,name,sex from user  
  2. where name='shenjian'

畫外音:該SQL語句與上一個SQL語句不同的地方在于,被查詢的列,多了一個sex字段。

結果說明:

Extra為Using index condition說明,確實命中了索引,但不是所有的列數據都在索引樹上,還需要訪問實際的行記錄。

畫外音:聚集索引,普通索引的底層實現差異,詳見《1分鐘了解MyISAM與InnoDB的索引差異》。

這類SQL語句性能也較高,但不如Using index。

問題來了,如何優化為Using index呢?

四、【Using filesort】

實驗語句:

  1. explain select * from user order by sex; 

結果說明:

Extra為Using filesort說明,得到所需結果集,需要對所有記錄進行文件排序。

這類SQL語句性能極差,需要進行優化。

典型的,在一個沒有建立索引的列上進行了order by,就會觸發filesort,常見的優化方案是,在order by的列上添加索引,避免每次查詢都全量排序。

五、【Using temporary】

explain select * from user group by name order by sex;

實驗語句:

  1. explain select * from user group by name order by sex; 

結果說明:

Extra為Using temporary說明,需要建立臨時表(temporary table)來暫存中間結果。

這類SQL語句性能較低,往往也需要進行優化。

典型的,group by和order by同時存在,且作用于不同的字段時,就會建立臨時表,以便計算出最終的結果集。

六、【Using join buffer (Block Nested Loop)】

實驗語句:

  1. explain select * from user where id in(select id from user where sex='no'); 

結果說明:

Extra為Using join buffer (Block Nested Loop)說明,需要進行嵌套循環計算。

畫外音:內層和外層的type均為ALL,rows均為4,需要循環進行4*4次計算。

這類SQL語句性能往往也較低,需要進行優化。

典型的,兩個關聯表join,關聯字段均未建立索引,就會出現這種情況。常見的優化方案是,在關聯字段上添加索引,避免每次嵌套循環計算。

結尾:

explain是SQL優化中最常用的工具,搞定type和Extra,explain也就基本搞定了。

以上幾篇文章,強烈建議大家讀透。

【本文為51CTO專欄作者“58沈劍”原創稿件,轉載請聯系原作者】

戳這里,看該作者更多好文

責任編輯:趙寧寧 來源: 51CTO專欄
相關推薦

2015-11-23 17:34:33

秒借

2018-03-12 21:31:24

區塊鏈

2017-03-16 08:46:57

延時消息環形隊列數據結構

2020-10-13 18:22:58

DevOps工具開發

2019-07-28 20:49:37

回表查詢索引覆蓋MySQL

2017-12-20 09:42:39

PythonNginx日志

2023-08-24 09:01:25

消息拉取RocketMQ

2023-08-01 09:01:51

Broker? 事務消息selector

2023-08-14 09:16:26

消息存儲磁盤

2019-07-09 14:42:17

SQLexplain索引

2019-07-24 07:05:51

CPU進程ID端口

2019-08-07 07:04:54

內存緩存數據庫KV

2018-03-12 14:37:50

區塊鏈比特幣架構

2018-03-23 11:56:09

相似性推薦推薦算法推薦

2017-11-20 10:25:20

數據庫MySQL索引

2024-05-16 11:13:16

Helm工具release

2020-12-17 06:48:21

SQLkafkaMySQL

2025-06-11 02:02:00

2020-05-22 10:20:27

Shiro架構字符串

2018-03-23 11:23:14

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 天天草夜夜骑 | 国产精品久久精品 | 久久a久久 | 爱综合| 久久国产视频网站 | 国产三区在线观看视频 | 国产精品久久久久久妇女6080 | 粉嫩国产精品一区二区在线观看 | 国产精品一区二区三区在线 | 依人成人 | 国产午夜精品一区二区三区四区 | 日韩波多野结衣 | 超碰婷婷 | 天天操天天射综合 | 久久久久久久久久久久久九 | 日本在线视频一区二区 | 久久小视频| 亚洲视频中文 | 大学生a级毛片免费视频 | 国产一区二区三区四区五区加勒比 | 成人在线视频一区 | 激情视频网站 | 欧美日韩亚洲三区 | 成年人黄色免费视频 | 国产午夜精品视频 | 黄色在线观看国产 | 精品乱码一区二区三四区 | 亚洲精品福利在线 | 精品在线免费观看视频 | 中文字幕亚洲一区二区三区 | 亚洲高清一区二区三区 | 国产精品电影网 | 国产精品综合 | 日韩免费网站 | 久久国产一区二区三区 | 欧美精品在线播放 | 中文字幕 在线观看 | 亚洲精品久久久久久久久久久 | 亚洲国产精品人人爽夜夜爽 | 国产在线精品免费 | av影音在线 |