深入淺出Mysql(四)

2021-10-09 13:52:50 字數 3302 閱讀 6582

大批量插入資料優化

1、對應myisam型別的表,可以通過以下方式快速的匯入大量資料

alter table tablname disable keys;

loading the data

alter table tablname enable keys;

這兩個命令用來開啟或者關閉myisam表非唯一索引的更新。

2、對於innodb型別的表,這種方式並不能提高匯入的效率,我們可以採取下面幾種策略:

(1)、因為innodb型別的表是按照主鍵的順序儲存的,所以將匯入的資料按照主鍵的順序排列,可以有效的提高匯入資料的效率。如果innodb表沒有主鍵,那麼系統會預設建立乙個內部列作為主鍵,所以,如果可以給表建立乙個主鍵,就可以利用這個優勢提高匯入資料的效率。

(2)、在匯入資料前執行set unique_checkes = 0,關閉唯一性校驗,在匯入結束後執行set unique_checks = 1,恢復唯一性校驗,可以提高匯入的效率

(3)、如果應用使用自動提交的方式,建議在匯入前執行set autocommit = 0,匯入結束收再執行set autocommit = 1,也可以提高匯入效率

優化group by語句

預設情況下,mysql排序所有group by col1,col2,…的字段。查詢的方法如同在查詢中指定order by col1,col2,….。如果顯示的包括乙個包含相同的列order by 子句,mysql可以毫不減速的對他進行優化,儘管仍然進行排序。

如果查詢包括group by但你還想要避免排序結果的消耗,你可以指定order by null禁止排序,例如:

select a,count(*) form bar group by a order by null;
優化order by語句

在某些情況下,mysql可以使用乙個索引來滿足order by子句,而不需要額外的排序,where條件和order by使用相同的索引,並且order by的順序和索引順序相同,並且order by的字段都是公升序或者都是降序。

例如:下列sql可以使用索引

select * from t1 order by key_part1,key_part2,....;

select * from t1 where key_part1 = 1 order by key_part1 desc,key_part2 desc;

select * from t1 order by key_part1 desc,key_part2 desc;

以下情況不適用索引

select * from t1 order by key_part1 desc,key_part2 asc; -- 排序混合

select * from t1 where key2 = constant order by key1; -- 用於查詢行的關鍵字和order by中所使用的不同

select * from t1 order by key1,key2;-- 一對不同的關鍵字使用order by

優化join語句

假設我們要將所有沒有訂單記錄的使用者取出來,可以用下面這個查詢完成:

select * from customerinfo where customer_id not in (select customer_id from salesinfo);

如果使用join來完成,速度將會快很多。尤其是salesinfo表中對customer_id建有索引的話,效能將會更好,查詢如下:

select * from customerinfo left join salesinfo on customerinfo.customer_id = salesinfo.customer_id where salesinfo.customer_id is null;
join的效率更高是因為mysql不需要再記憶體中建立臨時表來完成這個邏輯上需要兩步驟的查詢工作。

優化or條件

對於or子句,如果要利用索引,則or之間的每乙個條件都必須用到索引

查詢優先還是更新(insert,update,delete)優先

我們首先應該確定應用的型別,判斷應用是以查詢為主,還是以更新為主,下面我們提到的改變排程策略的方法主要指針對myisam儲存引擎,對於innodb儲存引擎,語句的執行時由獲得行鎖的順序決定的。

mysql的預設排程策略總結如下:

1、寫入操作優先於讀取操作

2、對某張表的寫入操作某一時刻只能發生一次,寫入請求按照他們到來的次序來處理

3、對某張表的多個讀取操作可以同時進行,mysql提供了幾個語句調節符,允許你修改他的排程策略

(1)、low_priority關鍵字應用於delete、insert、load data、replace和update

(2)、high_priority關鍵字應用於select和insert語句

(3)、delayed關鍵字應用於insert和replace語句

優化表的資料型別

我們可以使用procedure analyse()對當前已有用用的表型別的判斷,該函式可以對資料表中的列的資料型別提出優化建議,可以根據應用的實際情況酌情考慮是否實施優化。

語法:

select * from tbl_name procedure analyse();

select * from tbl_name procedure analyse(16,256);

輸出的每一列資訊都會對資料表中的列的資料型別提出優化建議。第二個例子告訴procedure analyse()不要為那些包含的值多於16個或者256位元組的enum型別提出建議,如果沒有這個限制,輸出資訊可能很長,enum定義通常很難閱讀。

通過拆分,提高表的訪問效率

這裡所說的拆分主要針對myisam型別的表,拆分的方法分為兩種情況:

1、縱向拆分

按照應用訪問的頻度,將表中經常訪問的字段和不經常訪問的字段拆分成兩個表,經常訪問的字段盡量是定長的,這樣可以有效的提高表的查詢和更新效率

2、橫向拆分

按照應用的情況,有目的的將資料橫向拆分成幾個表或者通過分區分到多個分割槽中,這樣可以有效的避免myisam表的讀取和更新導致鎖的問題。

使用冗餘統計表使用create temporary table語句,他是基於session的表,表的資料儲存在記憶體裡面,當session斷掉後,表自然消除 對於大表的統計分析,如果統計的表資料列不大,利用insert…select 將資料遷移到臨時錶比直接在大表上統計效率更高。

深入淺出MySQL

說明索引的設計和使用 sql中的安全問題 常用sql技巧 sql優化過程 優化資料庫物件 鎖問題 本站 深入淺出mysql 個人部落格 深入淺出mysql 1 設計索引原則 2 小常識 3 btree索引 1 了解sql執行頻率 使用show session global statusa來獲得伺服器...

深入淺出MySQL筆記(二)

本筆記為學習該書所記,便於複習。包含第三 四章筆記。資料型別與運算子 toc 整數型別 zerofill unsigned auto increment 浮點數型別 定點數型別 decimal m,d show warningsl 位型別bit m hex data datatime timesta...

深入淺出MySQL筆記(三)

本筆記為學習該書所記,便於複習。包含第五 六章筆記。常用函式與圖形化工具的使用。toc 常用字串函式 concat s1,s2.sn 連線s1,s2.sn為乙個字串 insert str,x,y,instr 將字串str從第x位置開始,y個字元長的子串替換為字串instr lower str 將字串...