mysql優化點整理

2021-09-02 10:08:44 字數 4321 閱讀 7690

優化sql一般步驟:

1.通過show (session 或者 global) status來檢視( 當前連線 或者 資料庫上次開機以來 )的伺服器狀態資訊,預設是session

例如:show status like '%com_%' : com_***表示***語句執行的總次數,這總次數是針對所有引擎的總和

show status like '%innodb_%': 這裡面針對的就是innodb引擎的一些統計總和,例如innobb_rows_read:select的行數總和

其他有用引數檢視:

show status like 'connections'  :嘗試連線mysql的次數

show status like 'uptime':       伺服器工作時間,如果是myisam引擎,則需要進行碎片整理

show status like 'slow_queries': 慢查詢的sql次數

2.定位執行效率較低的sql語句:有兩種方法

第一種:使用慢日誌定位(必須先開啟了慢查詢)

show variables like "long_query_time";  // 檢視多少秒算慢查詢,預設是10秒

set long_query_time = 0.5                      // 設定本次連線中的慢查詢為0.5秒,便於除錯

show status like "slow_queries";             // 顯示慢查詢的條數

檢視慢查詢的日誌檔案,從中分析查詢慢的sql語句

第二種:1. 使用show processlist命令檢視當前mysql正在進行的「執行緒」,包括執行緒的狀態、是否鎖表等,也就能實時了解sql的執**況

2. show processlist中的status欄位表示當前sql執行的狀態情況,比較重要

3. 對於「執行緒的設定」檢視命令:

show variables like 'thread%';

其中,thread_cache_size:「執行緒池」中存放的「最大連線線程數」,預設為0,該值的設定一般與物理記憶體有關,物理記憶體》3g的,設定為64,計算「執行緒的失效率」: thread_created/connections來衡量 thread_cache_size的設定是否合適

thread_concurrency:執行緒的併發數

thread_handing:        執行緒池處理連線的方式

thread_stack:             每個連線被建立的時候,mysql分配給它的「記憶體」  .這個值一般認為預設就可以應用於大部分場景了,除非必要非則不要動它

4. 檢視資料庫伺服器的執行緒運**況:

show global status like 'thread%';

其中,threads_created:表示建立過的執行緒數,如果發現該值過大的話,表明mysql伺服器一直在建立執行緒,這也是比較耗資源,可以適當增加配置檔案中thread_cache_size值,查詢伺服器

3.使用explain或desc來分析執行效率較低的sql語句

4.分析後應該對sql進行相應的補救措施,例如新增索引、優化字段型別和索引使用情況等等

5.通過查詢索引引數來檢視庫的索引使用情況:

5.1 show status like 'handler_read%'

5.2 handler_read_key:     表示乙個行被索引值讀取的次數(針對增加了索引後的分析情況),如果索引「有正在工作」,則該值應該是很高的,如果低,則表示即使建立了索引效能也提高不好

5.3 handler_read_rnd_next:表示在資料檔案中讀取下一行的請求次數,該值「越高」則表示「查詢效率低下」,應該使用新增索引來優化。如果增加了索引,還是不高則表示增加了索引效能提高不好

6.定期分析和檢查表 (由於執行期間會進行表鎖,所以一般在資料庫不繁忙時候進行優化)

analyze table 表名

check table 表名

7. 定期優化表(由於執行期間會進行表鎖,所以一般在資料庫不繁忙時候進行優化)

optimize table 表名  該命令只對myisam、innodb、bdb引擎有效,舉例myisam引擎的表a,其a.myd檔案(儲存資料的檔案)會不斷增大,即使是刪除表的部分資料,該檔案依然是之前的大小,這是由於碎片存在的原因,需要通過

optimize

操作了清理碎片從而減少表的大小

常用的sql優化

1.優化大批量插入資料

1.1 myisam引擎的表:禁用索引,插入資料時,mysql會根據表的索引對插入的資料進行排序,如果插入大量資料時,需要先禁用索引,插入完畢後再啟用

禁用:alter table 表名 disable keys

開啟:alter table 表名 enable keys

對應新建立的表,可以先插入資料後再建立索引

1.2 innodb的表:其根據主鍵來排序的,所以在匯入資料之前可以對資料針對主鍵欄位來排序,再進行匯入

關閉唯一性校驗(set unique_checks = 0),匯入資料後,再開啟 ( set unique_checks  = 1 )

1.3 能夠使用load data infile 語句匯入資料的就不要用insert into 語句

2.優化insert語句

2.1 同乙個客戶端insert資料,應該使用values後跟多值的語句

2.2 不同客戶端insert資料,使用insert delayed into,delayed引數表示讓該插入立即執行,但是其實資料是被存放在記憶體的佇列中排隊,並沒有真正的立即執行,而是等到mysql空閒了再執行,使用該引數,mysql會立即返回ok狀態給客戶端,提高響應速度,但是壞處是並不能返回自增id,以及如果系統崩潰加mysql未來得及執行排隊中的sql,會導致資料丟失

其中一種應用場景:處理mysql由於「併發插入」造成的"堵塞問題",在多執行緒併發的情況下,同時搶占mysql的資源,而mysql的myisam引擎預設是表鎖的,當a程序鎖表進行插入時候,b程序只能等待,這樣就容易造成堵塞

3.優化group by語句

預設情況下,mysql是會對group by 欄位1,欄位2···進行排序,也就等同於加上了order by,如果想在沒有使用order by避免排序的消耗,需要加上 order by null

例如:select id, sum(money) from sales group by id order by null  通過explain檢視extra選項並沒有using filesort

優化資料庫設計

4.1 使用procedure analyse() 分析已有的表的字段狀況,根據max_value、max_length等選項來優化欄位的型別,用法:select * from 表名 procedure analyse();

4.2 拆分表來提高表的訪問效率,針對myisam的拆分有:

垂直拆分:將主列與次列分成兩個表存放,缺點是查詢所有資料時候需要關聯查詢

水平拆分:資料列本身的資料意義拆分,比如將近3個月的資料列存在乙個表,3個月前的存在另乙個表

4.3 逆規範化:規範化越高,所要關聯的表就越多,從而導致表之間的連線頻繁,而表之間的連線操作是效能較低的操作,直接影響了查詢效率,所以,如果通過在需要去關聯的表中新增「冗餘的字段」來避免關聯連線,可以提高查詢效率

逆規範技術一般有:

增加冗餘列:指在多個表中具有相同的列,它常用來在查詢時候避免表連線操作

增加派生列:指增加的列來自其它表的資料,有其他表的中的資料通過計算生成,它可以避免表連線操                            作和使用計算函式

重新組表:   指如果需要經常檢視多個表連線出來的結果資料,則可以把這多個表組合成乙個表來提高                              查詢效能

4.4 使用中間表提高統計查詢效率

中間表複製源表的部分資料,並且與源表隔離,在中間表上做統計操作並不會影響源表

在中間表增加索引等優化手段,可以提高統計效率

知識點整理 mysql怎麼檢視優化器優化後的sql

1.新建兩張表 create table t1 m1 int,n1 char 1 create table t2 m2 int,n2 char 1 2.插入些資料 insert into t1 values 1,a 2,b 3,c insert into t2 values 2,b 3,c 4,d ...

優化演算法知識點整理

幾種優化演算法,梯度下降的種類 考慮無約束優化問題 minxf x minxf x 梯度下降 梯度下降法是一種常用的一階優化方法,是求解無約束優化問題最簡單 最經典的方法之一。其中,f x 連續可微。若能構造乙個序列x0,x1,x2,x0,x1,x2,滿足 f xt 1 根據泰勒一階展開 f x x...

MySql操作要點整理

tinyint 1 位元組 smallint 2 個位元組 mediumint 3 個位元組 int 4 個位元組 integer 4 個位元組 bigint 8 個位元組 float x 4 如果 x 24 或 8 如果 25 x 53 float 4 個位元組 double 8 個位元組 dou...