當面對乙個有 sql 效能問題的資料庫時,我們應該從何處入手來進行系統的分析,使得能 夠盡快定位問題sql並盡快解決問題本文屬於sql 優化系列篇
mysql
客戶端連線成功後,通過show [session|global]status
命令可以提供伺服器狀態資訊,也可以在作業系統上使用mysqladmin extended-status
命令獲得這些訊息。show [session|global] status
可以根據需要加上引數「session
」或者「global
」來顯示session
級(當前連線)的統計結果和global
級(自資料庫上次啟動至今)的統計結果。如果不寫,預設使用引數是「session
」 。
下面的命令顯示了當前session
中所有統計引數的值:
mysql> show status like 'com_%';
+--------------------------+-------+
| variable_name | value |
+--------------------------+-------+
| com_admin_commands | 0 |
| com_alter_db | 0 |
| com_alter_event | 0 |
| com_alter_table | 0 |
| com_analyze | 0 |
| com_backup_table | 0 |
| com_begin | 0 |
| com_change_db | 1 |
| com_change_master | 0 |
| com_check | 0 |
| com_checksum | 0 |
| com_commit | 0 |
......
com_***
表示每個***
語句執行的次數,我們通常比較關心的是以下幾個統計引數。
上面這些引數對於所有儲存引擎的表操作都會進行累計。下面這幾個引數只是針對innodb
儲存引擎的,累加的演算法也略有不同。
通過以上幾個引數,可以很容易地了解當前資料庫的應用是以插入更新為主還是以查詢 操作為主,以及各種型別的sql
大致的執行比例是多少。對於更新操作的計數,是對執行次數的計數,不論提交還是回滾都會進行累加。
對於事務型的應用, 通過com_commit
和com_rollback
可以了解事務提交和回滾的情況, 對於回滾操作非常頻繁的資料庫,可能意味著應用編寫存在問題。
此外,以下幾個引數便於使用者了解資料庫的基本情況。
可以通過以下兩種方式定位執行效率較低的sql
語句。
通過以上步驟查詢到效率低的sql
語句後, 可以通過explain
或者desc
命令獲取mysql
如何執行select
語句的資訊,包括在select
語句執行過程中表如何連線和連線的順序,比如想計算2006
年所有公司的銷售額,需要關聯sales
表和company
表,並且對moneys
字段 做求和(sum
)操作,相應sql
的執行計畫如下:
mysql> explain select sum(moneys) from sales a,company b where a.company_id = b.id and a.year = 2006\g;
*************************** 1. row ***************************
id: 1
select_type: ******
table: a
type: all
possible_keys: null
key: null
key_len: null
ref: null
rows: 1000
extra: using where
*************************** 2. row ***************************
id: 1
select_type: ******
table: b
type: ref
possible_keys: ind_company_id
key: ind_company_id
key_len: 5
ref: sakila.a.company_id
rows: 1
extra: using where; using index
2 rows in set (0.00 sec)
每個列的簡單解釋如下:
經過以上步驟,基本就可以確認問題出現的原因。此時使用者可以根據情況採取相應的措施,進行優化提高執行的效率。
在上面的例子中,已經可以確認是對 a 表的全表掃瞄導致效率的不理想,那麼對a
表的year
字段建立索引,具體如下:
mysql> create index ind_sales2_year on sales2(year);
query ok, 1000 rows affected (0.03 sec)
records: 1000 duplicates: 0 warnings: 0
建立索引後,再看一下這條語句的執行計畫,具體如下:
mysql> explain select sum(moneys) from sales a,company b where a.company_id = b.id and a.year = 2006\g;
*************************** 1. row ***************************
id: 1
select_type: ******
table: a
type: ref
possible_keys: ind_sales2_year
key: ind_sales2_year
key_len: 2
ref: const
rows: 1
extra: using where
*************************** 2. row ***************************
id: 1
select_type: ******
table: b
type: ref
possible_keys: ind_company2_id
key: ind_company2_id
key_len: 5
ref: sakila.a.company_id
rows: 1
extra: using where; using index
2 rows in set (0.00 sec)
可以發現建立索引後對 a 表需要掃瞄的行數明顯減少 (從1000
行減少到1
行) , 可見索引的 使用可以大大提高資料庫的訪問速度,尤其在表很龐大的時候這種優勢更為明顯。 優化SQL語句一般步驟
即查詢到當前session執行select insert update delete操作的次數,了解到當前資料庫的應用是以更新為主還是以查詢為主,以及各種型別的sql大致的執行比例是多少。對於事務型的應用,通過com commit和com rollback可以了解事務提交和回滾的情況,對於回滾操作非...
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.常用的優化措施是新增索引。新增索引,我們不...