1. 程式人生 > >mysql使用explain進行查詢效能分析

mysql使用explain進行查詢效能分析

一、首先新建員工表和部門表,並載入資料,新建mysql.sql,如下:

create table emp(
empno int,
ename varchar(20),
job varchar(20),
mgr int,
hiredate varchar(20),
sal double,
comm double,
deptno int
);

create table dept(
deptno int,
dname varchar(20),
loc varchar(20)
);

load data local infile "/opt/datas/hive/emp.txt" into table emp; 
load data local infile "/opt/datas/hive/dept.txt" into table dept; 

emp.txt中的資料可以網上找

dept.txt中的資料:

10ACCOUNTINGNEW YORK
20RESEARCHDALLAS
30SALESCHICAGO
40OPERATIONSBOSTON

二、建立索引:

create index index_sal on emp(sal);

三、使用explain語句判斷索引是否生效:

explain select * from emp where sal=3000;

輸出結果如下所示:

+----+-------------+-------+------+---------------+-----------+---------+-------+------+-------+
| id | select_type | table | type | possible_keys | key       | key_len | ref   | rows | Extra |
+----+-------------+-------+------+---------------+-----------+---------+-------+------+-------+
|  1 | SIMPLE      | emp   | ref  | index_sal     | index_sal | 9       | const |    2 | NULL  |
+----+-------------+-------+------+---------------+-----------+---------+-------+------+-------+

可以看到key的值為index_sal,表示實際使用的索引就是index_sal,說明索引已經生效;其餘列的解釋如下:

table:顯示這一行的資料是關於哪張表的

type:這是重要的列,顯示連線使用了何種型別。從最好到最差的連線型別為const、eq_reg、ref、range、indexhe和ALL

possible_keys:顯示可能應用在這張表中的索引。如果為空,沒有可能的索引。可以為相關的域從WHERE語句中選擇一個合適的語句

key: 實際使用的索引。如果為NULL,則沒有使用索引。很少的情況下,MYSQL會選擇優化不足的索引。這種情況下,可以在SELECT語句中使用USE INDEX(indexname)來強制使用一個索引或者用IGNORE INDEX(indexname)來強制MYSQL忽略索引

key_len:使用的索引的長度。在不損失精確性的情況下,長度越短越好

ref:顯示索引的哪一列被使用了,如果可能的話,是一個常數

rows:MYSQL認為必須檢查的用來返回請求資料的行數

Extra:關於MYSQL如何解析查詢的額外資訊。將在表4.3中討論,但這裡可以看到的壞的例子是Using temporary和Using filesort,意思MYSQL根本不能使用索引,結果是檢索會很慢

extra列返回的描述的意義

Distinct:一旦MYSQL找到了與行相聯合匹配的行,就不再搜尋了

Not exists: MYSQL優化了LEFT JOIN,一旦它找到了匹配LEFT JOIN標準的行,就不再搜尋了

Range checked for each Record(index map:#):沒有找到理想的索引,因此對於從前面表中來的每一個行組合,MYSQL檢查使用哪個索引,並用它來從表中返回行。這是使用索引的最慢的連線之一

Using filesort: 看到這個的時候,查詢就需要優化了。MYSQL需要進行額外的步驟來發現如何對返回的行排序。它根據連線型別以及儲存排序鍵值和匹配條件的全部行的行指標來排序全部行

Using index: 列資料是從僅僅使用了索引中的資訊而沒有讀取實際的行動的表返回的,這發生在對錶的全部的請求列都是同一個索引的部分的時候

Using temporary 看到這個的時候,查詢需要優化了。這裡,MYSQL需要建立一個臨時表來儲存結果,這通常發生在對不同的列集進行ORDER BY上,而不是GROUP BY上

Where used 使用了WHERE從句來限制哪些行將與下一張表匹配或者是返回給使用者。如果不想返回表中的全部行,並且連線型別ALL或index,這就會發生,或者是查詢有問題不同連線型別的解釋(按照效率高低的順序排序)

system 表只有一行:system表。這是const連線型別的特殊情況

const:表中的一個記錄的最大值能夠匹配這個查詢(索引可以是主鍵或惟一索引)。因為只有一行,這個值實際就是常數,因為MYSQL先讀這個值然後把它當做常數來對待

eq_ref:在連線中,MYSQL在查詢時,從前面的表中,對每一個記錄的聯合都從表中讀取一個記錄,它在查詢使用了索引為主鍵或惟一鍵的全部時使用

ref:這個連線型別只有在查詢使用了不是惟一或主鍵的鍵或者是這些型別的部分(比如,利用最左邊字首)時發生。對於之前的表的每一個行聯合,全部記錄都將從表中讀出。這個型別嚴重依賴於根據索引匹配的記錄多少—越少越好

range:這個連線型別使用索引返回一個範圍中的行,比如使用>或<查詢東西時發生的情況

index: 這個連線型別對前面的表中的每一個記錄聯合進行完全掃描(比ALL更好,因為索引一般小於表資料)

ALL:這個連線型別對於前面的每一個記錄聯合進行完全掃描,這一般比較糟糕,應該儘量避免

相關推薦

mysql使用explain進行查詢效能分析

一、首先新建員工表和部門表,並載入資料,新建mysql.sql,如下:create table emp(empno int,ename varchar(20),job varchar(20),mgr int,hiredate varchar(20),sal double,co

MongoDB慢查詢效能分析

最近,長期運營後的港臺服出現一個問題,web充值很慢,用gm指令查詢玩家資訊也很慢。最後定位到MongoDB查詢也很慢。   剛開始定位的時候,運營SA直接查指定的玩家,並反映很慢,就猜測是索引的問題。有可能是索引太大,沒法全部放進記憶體,導致讀索引需要多次讀取磁碟,最後整個查詢

利用PyCharm的Profile工具進行Python效能分析

Profile: PyCharm提供了效能分析工具Run-》Profile,如下圖所示。利用Profile工具可以對程式碼進行效能分析,找出瓶頸所在。 測試: 下面以一段測試程式碼來說明如何使用pycharm的Profile功能。 測試程式碼見下文,檔案命名為

Mongodb分頁查詢效能分析

通用的分頁思路 通用的分頁方案是基於row_number的分頁思想,也就是說取第(pageIndexpageSize)到第(pageIndexpageSize + pageSize) db.getCol

mongodb .explain('executionStats') 查詢效能分析(轉)

mongodb效能分析方法:explain()     為了演示的效果,我們先來建立一個有200萬個文件的記錄。(我自己的電腦耗了15分鐘左右插入完成。如果你想插更多的文件也沒問題,只要有耐心等就可以了。) 1 for(var i=0;i<2000000;i++){

oracle11g利用分割槽表進行查詢效能的優化

----假如員工表的資料量很大,我們可以對員工表建立分割槽表(根據部門編號採用列表分割槽) create table employee (   empId int constraint p_emp primary key,   empName varchar2(20) not null ,   gender

SSH登陸遠端Linux伺服器執行VisualVM, 進行Java效能分析

SSH登陸遠端Linux伺服器是普遍的方式,下面講述如何使用Putty,Xming工具在Windows機器上SSH登陸到Linux伺服器,並執行VisualVM視覺化介面程式,進行Java效能分析。 Step 1: 配置Linux伺服器上sshd_config檔案, 允許X

前端效能優化之利用 Chrome Dev Tools 進行頁面效能分析

背景 我們經常使用 Chrome Dev Tools 來開發除錯,但是很少知道怎麼利用它來分析頁面效能,這篇文章,我將詳細說明怎樣利用 Chrome Dev Tools 進行頁面效能分析及效能報告資料如何解讀。 分析面板介紹 上圖是 Chrome Dev Tools 的一個截圖,其中,我認為能用於進行頁面

hibernate抓取策略效能分析,子查詢/連線查詢效能對比

https://blog.csdn.net/qq_40762011/article/details/82993283 https://blog.csdn.net/lzm18064126848/article/details/50578285 https://blog.csdn.net/luckarecs/

多分查詢法的效能分析--二分還是其他?

在一個有序數列中,共K個數字,在其中查詢一個數字,常使用二分查詢方法對資料進行分段以縮小範圍進行定位來替代遍歷。 另外一個相似的問題模型,K個電阻串連在一起,有1個電阻壞了,導致電路不通,問如何測定找到這個故障電阻。 問題的提出:常用方法都是採用二分法,現在考慮下采用3分呢,4分呢,……,K

.Net Core使用 MiniProfiler 進行效能分析(轉)

轉自:http://www.cnblogs.com/ideacore/p/9505425.html 官方文件: https://miniprofiler.com/dotnet/AspDotNetCore 1、新增包 MiniProfiler.AspNetCore.Mvc  &

表連線join查詢與where後使用子查詢效能分析

宣告:本文摘自https://www.cnblogs.com/cdf-opensource-007/p/6540521.html 子查詢就是在一條查詢語句中還有其它的查詢語句,主查詢得到的結果依賴於子查詢的結果。 子查詢的子語句可以在一條sql語句的FROM,JOIN,和WHERE後面,本文主要針對在WH

用 dotTrace 進行效能分析時,各種不同效能分析選項的含義和用途

對 .NET 程式進行效能分析,dotTrace 能應對絕大多數的場景。在開啟一個程序進行效能分析之前,我們會看到一些效能分析選項(Profiler Options)。本文將介紹這幾個選項的含義,並用實際的例子來說明其用途。 本文內容

Linux下用火焰圖進行效能分析

1 火焰圖簡介 很多人感冒發燒的時候, 往往會模仿神農氏嘗百草的路子: 先嚐嘗抗病毒的藥, 再試試抗細菌的藥, 甭管家裡有什麼藥挨個試, 什麼中藥西藥, 瞎貓總會碰上死耗子, 如此做法自然是不可取的, 正確的做法應該是去醫院驗個血, 確診後再對症下藥. 讓我們回

基於Lucene查詢原理分析Elasticsearch的效能

摘要: 前言 Elasticsearch是一個很火的分散式搜尋系統,提供了非常強大而且易用的查詢和分析能力,包括全文索引、模糊查詢、多條件組合查詢、地理位置查詢等等,而且具有一定的分析聚合能力。因為其查詢場景非常豐富,所以如果泛泛的分析其查詢效能是一個非常複雜的事情,而且除了

使用JDK自帶的VisualVM進行Java程式的效能分析

VisualVM是什麼? VisualVM是JDK自帶的一個用於Java程式效能分析的工具,JDK安裝完畢後就有啦,在JDK安裝目錄的bin資料夾下能找到名稱為jvisualvm.exe。 要使用VisualVM分析您的應用效能,首先得讓Visual

使用 VisualVM 進行效能分析及調優

原文轉載 概述 開發大型 Java 應用程式的過程中難免遇到記憶體洩露、效能瓶頸等問題,比如檔案、網路、資料庫的連線未釋放,未優化的演算法等。隨著應用程式的持續執行,可能會造成整個系統執行效率下降,嚴重的則會造成系統崩潰。為了找出程式中隱藏的這些問題,在專案開發後期往

Linux下利用Valgrind工具進行記憶體洩露檢測和效能分析

Valgrind通常用來成分析程式效能及程式中的記憶體洩露錯誤 一 Valgrind工具集簡紹 Valgrind包含下列工具:     1、memcheck:檢查程式中的記憶體問題,如洩漏、越界、非法指標等。     2、callgrind:檢測程式程式碼的執行

使用Perf4J進行效能分析和監控

原文地址:http://www.infoq.com/cn/articles/perf4j/ 許多開發人員都很熟悉墨菲法則的一個例子:他們發現在花費了大量時間確保應用程式在開發環境中快速和靈活之後,在釋出到生產環境的時候效能會不可思議的大幅下降。更糟糕的是,應用程式平時執行

如何使用JVisualVM進行效能分析

連線 1、本地機器的程式直接可以監聽到 2、遠端機器的程式需要加上JVM引數 -Dcom.sun.management.jmxremote= true -Dcom.sun.management.jmxremote.port= 9090 -Dcom.