深入浅出Mysql(四)
大批量插入數據優化
1、對應Myisam類型的表,可以通過以下方式快速的導入大量數據
這兩個命令用來打開或者關閉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禁止排序,例如:
優化order by語句
在某些情況下,Mysql可以使用一個索引來滿足order by子句,而不需要額外的排序,where條件和order by使用相同的索引,并且order by的順序和索引順序相同,并且order by的字段都是升序或者都是降序。
例如:下列sql可以使用索引
以下情況不適用索引
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建有索引的話,性能將會更好,查詢如下:
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()對當前已有用用的表類型的判斷,該函數可以對數據表中的列的數據類型提出優化建議,可以根據應用的實際情況酌情考慮是否實施優化。
語法:
輸出的每一列信息都會對數據表中的列的數據類型提出優化建議。第二個例子告訴procedure analyse()不要為那些包含的值多于16個或者256字節的enum類型提出建議,如果沒有這個限制,輸出信息可能很長,enum定義通常很難閱讀。
通過拆分,提高表的訪問效率
這里所說的拆分主要針對Myisam類型的表,拆分的方法分為兩種情況:
1、縱向拆分
按照應用訪問的頻度,將表中經常訪問的字段和不經常訪問的字段拆分成兩個表,經常訪問的字段盡量是定長的,這樣可以有效的提高表的查詢和更新效率
2、橫向拆分
按照應用的情況,有目的的將數據橫向拆分成幾個表或者通過分區分到多個分區中,這樣可以有效的避免Myisam表的讀取和更新導致鎖的問題。
使用冗余統計表?使用create temporary table語句,他是基于session的表,表的數據保存在內存里面,當session斷掉后,表自然消除 對于大表的統計分析,如果統計的表數據列不大,利用insert…select 將數據遷移到臨時表比直接在大表上統計效率更高。
來源:http://www.voidcn.com/article/p-zgmyllre-bhe.html
總結
以上是生活随笔為你收集整理的深入浅出Mysql(四)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 厨房装修选美多语音蒸烤集成灶+美多集成水
- 下一篇: 小户型选不好油烟机,装万事兴集成灶好吗?