1. 程式人生 > >MySQL常用效能分析方法-profile,explain,索引

MySQL常用效能分析方法-profile,explain,索引

1.查版本號

無論做什麼都要確認版本號,不同的版本號下會有各種差異。

>Select  version();


2.執行狀態分析

顯示哪些執行緒正在執行

>show processlist;


下面是完整的資訊


3.show profile

show profile預設的是關閉的,但是會話級別可以開啟這個功能,開啟它可以讓MySQL收集在執行語句的時候所使用的資源。

顯示資料庫列表

>show databases;

切換資料庫

>use test;

>SELECT @@profiling;


輸出0說明profiles功能是關閉的

開啟profiles功能

> set profiling=1;


需要注意為了明確看到查詢效能,我們啟用profiling並關閉query cache:

>SET profiling = 1;
>SET query_cache_type = 0;
>SET GLOBAL query_cache_size = 0;

執行2條SQL語句

> show profiles;


根據query_id 檢視某個查詢的詳細時間耗費
> show profile for query 3;


ALL
顯示所有效能資訊

>show profile all for query 3;


ALL
顯示所有效能資訊
BLOCK IO
顯示塊IO(塊的輸入輸出)的次數
CONTEXT SWITCHES
顯示自動和被動的上下文切換數量
IPC
顯示傳送和接收的訊息數量。
MEMORY
MySQL5.6中還未實現,只是計劃實現。
SWAPS
顯示swap的次數。

show profile for cpu只顯示cpu資訊


show profile for cpu,block io 顯示cpu和io資訊


4.分析執行計劃和最左字首原理

>explain + sql


關於分析結果需要注意索引有沒有用到。如果顯示type=ALL就是全表掃描了。

當用Explain檢視SQL的執行計劃時,裡面有列顯示了 key_len 的值,根據這個值可以判斷索引的長度,在組合索引裡面可以更清楚的瞭解到了哪部分欄位使用到了索引。

如果只用到一個int那麼就是4,比如上面的聯合索引只用到一個就是4,用到2個就是8以此類推。

聯合索引需要注意最左字首原理,就是說匹配最左邊的欄位,如果你的索引使用到abc三個欄位,那麼查a,ab,abc都可以用到索引,查ac和bc和b和c是不行的,必須從左到右逐漸增多。

最左字首參考:http://blog.codinglabs.org/articles/theory-of-mysql-index.html

聯合索引優化策略:
如何選擇索引列的順序
1.經常會被使用到的列優先
2.選擇性高的列優先
3.寬度小的列優先

如果不是int型資料,對於varchar,假如設定長度是255,由於你使用的是UTF-8字符集佔3個位元組,255*3+2=767,如上圖所示。

具體公式如下:

key_len的長度計算公式:
varchr(10)變長欄位且允許NULL    =  10 * ( character set:utf8=3,gbk=2,latin1=1)+1(NULL)+2(變長欄位)
varchr(10)變長欄位且不允許NULL =  10 *( character set:utf8=3,gbk=2,latin1=1)+2(變長欄位)

char(10)固定欄位且允許NULL        =  10 * ( character set:utf8=3,gbk=2,latin1=1)+1(NULL)
char(10)固定欄位且不允許NULL        =  10 * ( character set:utf8=3,gbk=2,latin1=1)

關於key_len的計算參考:http://www.cnblogs.com/gomysql/p/4004244.html

explain小技巧,可以加 \G以按行來顯示分析結果,避免因為按列顯示不下的情況:


5.索引選擇性與字首索引

因為索引雖然加快了查詢速度,但索引也是有代價的,另外,MySQL在執行時也要消耗資源維護索引,因此索引並不是越多越好。

一般兩種情況下不建議建索引。
1.表記錄比較少,超過2000條可以酌情考慮索引。
2.索引的選擇性較低。所謂索引的選擇性(Selectivity),是指不重複的索引值(也叫基數,Cardinality)與表記錄數(#T)的比值:
Index Selectivity = Cardinality / #T

顯然選擇性的取值範圍為(0, 1],選擇性越高的索引價值越大,這是由B+Tree的性質決定的。

參考:http://blog.codinglabs.org/articles/theory-of-mysql-index.html

其實就是算索引的不重複度

SELECT count(DISTINCT(ID))/count(*) AS Selectivity FROM xxxx;
SELECT count(DISTINCT(xx))/count(*) AS Selectivity FROM xxxx;
SELECT count(DISTINCT(concat(xx, xxx)))/count(*) AS Selectivity FROM xxxx;
SELECT count(DISTINCT(concat(xxx, left(xx, 2))))/count(*) AS Selectivity FROM xxxx;


很明顯因為主鍵id是不會重複的所以不重複度是100%也就是1.

6.覆蓋索引

覆蓋索引是指索引的葉子節點已包含所有要查詢的列,因此不需要訪問表資料所謂“回表”。

覆蓋索引的優點
1.優化快取,減少磁碟IO
2.減少隨機IO,變隨機IO為順序IO
3.避免對Innodb主鍵索引的二次查詢
4.避免MyISAM表進行系統呼叫

下面是《高效能MySQL(第3版)》中關於explain的Extra列的資訊:


下面舉例

第一條sql和第二條sql都是where帶相同的查詢條件,這個已經建了索引,但是select裡第一條是都覆蓋索引的,而第二條是*,自然有不覆蓋的,所以需要回表

這樣效能就差很多了。


再開啟profile,很明顯回表的要慢0.012秒,也就是12毫秒。


7.檔案排序和索引排序

使用索引掃描來優化排序條件
1.索引的列順序和Order by子句的順序完全一致
2.索引中所有列的方向(升序,降序)和Order by子句完全一致
3.Order by中的欄位全部在關聯表中的第一張表中


上面是一些不同的場景,其實就是如果排序可以利用索引就可以避免檔案排序。

要想知道真實的時間還是需要執行SQL,然後比較。


上圖中使用主鍵索引id排序的查詢是最快的,而使用二級索引,或者無索引的排序是非常耗時的需要10秒和17秒。使用了二級索引稍微好點,但是效果也不好。

相關推薦

MySQL常用效能分析方法-profileexplain索引

1.查版本號無論做什麼都要確認版本號,不同的版本號下會有各種差異。>Select  version();2.執行狀態分析顯示哪些執行緒正在執行>show processlist;下面是完整的資訊3.show profileshow profile預設的是關閉的,但

mysql效能優化-慢查詢分析、優化索引和配置 (慢查詢日誌explainprofile

一、優化概述 二、查詢與索引優化分析 1效能瓶頸定位 Show命令 慢查詢日誌 explain分析查詢 profiling分析查詢 2索引及查詢優化 三、配置優化 1)      max_connections 2)      back_log 3)      interactive_timeout 4)

MySQL效能分析Profile

在MySQL資料庫中,可以通過配置profiling引數來啟用SQL剖析。該引數開啟後,後續執行的SQL語句都將記錄其資源開銷,諸如IO,上下文切換,CPU,Memory等,根據這些開銷分析當前SQL瓶頸從而進行優化與調整。 MySQL版本 mysql> show vari

mysql效能分析show profile/show profiles

MySQL效能分析show profiles show profile 和 show profiles 語句可以展示當前會話(退出session後,profiling重置為0) 中執行語句的資源使用情況。 Profiling 功能由MySQL會話變數 : profiling控制,預設是OFF.關

linux效能分析工具介紹(CPU記憶體磁碟I/O網路)

一. CPU效能評估 1.vmstat [-V] [-n] [depay [count]] -V : 打印出版本資訊,可選引數 -n : 在週期性迴圈輸出時,頭部資訊僅顯示一次 delay : 兩次輸出之間的時間間隔 count : 按照delay指定的時間間隔統計

MySql效能分析索引建立與優化

1、索引簡單語法 建立 CREATE [UNIQUE ] INDEX indexName ON mytable(columnname(length)); ALTER mytable ADD [UNIQUE ] INDEX [indexName] ON

mysql常用效能查詢語句

#檢視MySQL本次啟動後的執行時間(單位:秒) show status like 'uptime'; #檢視select語句的執行數 show status like 'com_select'; #檢視insert語句的執行數 show status like 'com_inser

效能分析方法

一、效能分析的常用手段 1、空間換時間,利用記憶體快取從磁碟上取出的資料,CPU可以直接訪問記憶體,從而比從磁碟讀取資料更高的效率。 2、時間換空間,當空間成為瓶頸的時候,切開資料分批次處理,用更少空間完成任務的處理。 3、分而治之,把任務切分,分開執行。 4、非同步處理,業務鏈路上有任務時間消耗較長

Android筆記-Linux Kernel Ftrace (Function Trace)解析(非常強悍的效能分析方法)

Android筆記-Linux Kernel Ftrace (Function Trace)解析 [email protected] by loda 在軟體開發時,通常都會面臨到系統效能調教的需求,我們希望知道哪些區塊的程式碼或函式

一些mysql資料庫效能優化方法

很多人都將 資料庫設計正規化 作為資料庫表結構設計“聖經”,認為只要按照這個正規化需求設計,就能讓設計出來的表結構足夠優化,既能保證效能優異同時還能滿足擴充套件性要求。殊不知,在N年前被奉為“聖經”的資料庫設計3正規化早就已經不完全適用了。這裡我整理了一些比較常見的資料庫表結構設計方面的優化技巧,希望對大

python3__常用資料分析圖形(熱力圖雷達圖箱線圖平行座標3D表面圖)

1.matplotlib.pyplot簡介 matplotlib.pyplot是一個有命令風格的函式集合,它看起來和MATLAB很相似。每一個pyplot函式都使一副影象做出些許改變,例如建立一幅圖,在圖中建立一個繪圖區域,在繪圖區域中新增一條線等等。在matplotlib.pypl

相關分析-5種常用相關分析方法

http://sanwen8.cn/p/2c62mIw.html 相關分析(Analysis of Correlation)是網站分析中經常使用的分析方法之一。通過對不同特徵或資料間的關係進行分析,發現業務運營中的關鍵影響及驅動因素。並對業務的發展進行預測。本篇文章將

一些mysql資料庫效能優化方法 (17/2/28整理)

一、MySQL 資料庫效能優化之SQL優化 優化目標 1.減少 IO 次數 IO永遠是資料庫最容易瓶頸的地方,這是由資料庫的職責所決定的,大部分資料庫操作中超過90%的時間都是 IO 操作所佔用的,減少 IO 次數是 SQL 優化中需要第一優先考慮

Linux常用效能分析命令

效能分析 vmstat 虛擬記憶體統計 用法 Usage:  vmstat [options] [delay [count]] Options:  -a, --active           active/inactive memory  -f, --forks

MySQL的萬字總結(快取索引Explain事務redo日誌等)

hello,小夥伴們,好久不見,MySQL系列停更了差不多兩個月了,也有小夥伴問我為啥不更了呢?其實我去看了MySQL的全集,準備憋個大招,更新篇長文(我不會告訴你是因為我懶的)。 好了,話不多說,直接開始吧。這篇文章將從查詢快取,索引,優化器,explain,redo日誌,undo日誌,事務隔離級別,鎖等方

Hive常用效能優化方法實踐全面總結

Apache Hive作為處理大資料量的大資料領域資料建設核心工具,資料量往往不是影響Hive執行效率的核心因素,資料傾斜、job數分配的不合理、磁碟或網路I/O過高、MapReduce配置的不合理等等才是影響Hive效能的關鍵。 Hive在執行任務時,通常會將Hive SQL轉化為MapReduce job

神奇的 SQL 之 MySQL 效能分析神器 → EXPLAINSQL 起飛的基石!

前言   開心一刻     某人養了一頭豬,煩了想放生,可是豬認識回家的路,放生幾次它都自己回來了。一日,這個人想了個狠辦法,開車帶著豬轉了好多路進山區放生,放生後又各種打轉,然後掏出電話給家裡人打了個電話,問道:“豬回去了嗎?”,家裡人:“早回來了,你在哪了,怎麼還沒

mysql 執行計劃分析三看 explain,profiling,optimizer_trace

roc var you time field 表之間 origin 依賴 nod http://blog.csdn.net/xj626852095/article/details/52767963 step 1 使用explain 查看執行計劃, 5.6後可以加參數

mysql 效能分析Explain使用

mysql 效能分析Explain使用1 說明 介紹 能幹嘛 如何使用 包含資訊 id select_type table type possible_keys key