即查詢到當前session執行select、insert、update、delete操作的次數,了解到當前資料庫的應用是以更新為主還是以查詢為主,以及各種型別的sql大致的執行比例是多少。
對於事務型的應用,通過com_commit和com_rollback可以了解事務提交和回滾的情況,對於回滾操作非常頻繁的資料庫,可能意味著引用編寫存在問題。
此外,以下幾個引數便於我們了解資料庫的基本情況。
1)通過慢查詢日誌定位那些執行效率較低的sql語句
(包含所有執行時間超過long_query_time秒的sql語句的日誌檔案)
2)慢查詢日誌在查詢結束以後才記錄,所以在應用反映執行效率出現問題的時候查詢慢查詢日誌並不能定位問題,可以使用show processlist命令檢視當前mysql在進行的執行緒,包括執行緒的狀態、是否鎖表等,可以實時地檢視sql的執**況,同時對一些鎖表操作進行優化。
通過以上步驟查詢到效率低的sql語句後,可以通過explain或者desc命令獲取mysql如何執行select語句的資訊,包括在select語句執行過程中表如何連線和連線的順序。
查詢出的結果中的引數type表示在表中找到所需行的方式,或者叫訪問型別,常見型別如下:
allindex
range
refeq_ref
const,system
null
從左至右,效能由最差到最好。
type = all,全表掃瞄
type = index,索引全掃瞄
type = range,索引範圍掃瞄,常見於<、>=、between等操作符
type = ref,使用非唯一索引掃瞄或唯一索引的字首掃瞄,返回匹配某個單獨值的記錄行
type = eq_ref,類似ref,區別就在使用的索引是唯一索引,對於每個索引鍵值,表中只有一條記錄匹配;簡單來說,就是多表連線中使用primary key或者unique index作為關聯條件
type = const/system,單錶中最多有乙個匹配行,查詢起來非常迅速,所以這個匹配行中的其他列的值可以被優化器在當前查詢中當作常量來處理,例如,根據主鍵primary key或者唯一索引unique index進行的查詢
type = null,mysql不用訪問表或者索引,直接就能夠得到結果
通過profile,我們能夠清楚地了解sql執行的過程,例如,我們知道myisam表有表元資料的快取(例如行數,即count()值),那麼對於乙個myisam表的count(*)是不需要消耗太多資源的,而對於innodb來說,就沒有這種元資料快取,count()執行得較慢。通過show profile for query 語句可以看到執行過程中線程得每個狀態和消耗的時間,可以看出在innodbb表中執行count()過程中時間主要消耗在sending data 這個狀態上,(這個狀態表示mysql執行緒開始訪問資料行並把結果返回給客戶端),而同樣表結構和資料量的myisam引擎表在executing之後直接就結束查詢,完全不需要訪問資料。
mysql提供了對sql的跟蹤trace,通過trace檔案能夠進一步了解為什麼優化器選擇a執行計畫而不選擇b執行計畫,幫助我們更好地理解優化器的行為。
經過以上步驟,基本就可以確認問題出現的原因。此時可以根據情況採取相應的措施,進行優化以提高執行的效率。比如建立索引,索引可以大大提高資料庫的訪問速度,尤其在表很龐大的時候這種優勢更為明顯。
1 優化SQL語句的一般步驟
當面對乙個有 sql 效能問題的資料庫時,我們應該從何處入手來進行系統的分析,使得能 夠盡快定位問題sql並盡快解決問題 本文屬於sql 優化系列篇 mysql客戶端連線成功後,通過show session global status命令可以提供伺服器狀態資訊,也可以在作業系統上使用mysqladm...
Mysql優化SQL語句的一般步驟
首先,我們需要顯示mysql的狀態,一系列操作導致的伺服器的動態值,我們只能看,來判斷,不能改。show status 會話級別的。這次登入以後的操作次數。show status like com insert show status like com select show status like...
MySql優化的一般步驟
mysql優化的一般步驟 1.通過show status 命令了解各種sql的執行效率 2.定位執行效率較低的sql語句 dql出現問題的概率較dml的大 mysql支援把慢查詢語句記錄到日誌檔案中。3.通過explain分析低效率的sql語句的執 況 4.常用的優化措施是新增索引。新增索引,我們不...