1 優化SQL語句的一般步驟

2021-09-25 21:29:35 字數 4054 閱讀 7238

當面對乙個有 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_commitcom_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.常用的優化措施是新增索引。新增索引,我們不...