Mysql從入門到精通學習筆記1-mysql性能優化

一、性能優化目標

        通過合理安排資源,調整系統參數使Mysql運行更快、更節省資源,增加系統反應速度;優化訪問包含查詢速度優化數據庫結構優化Mysql服務器優化等;

二、查詢速度優化

查詢優化分兩步,第一步分析查詢語句執行情況,分析語句執行瓶頸,第二步查詢語句儘可能使用索引,避免全表查詢

2.1分析查詢語句方式

   EXPLAIN   SELECT select_options;  例子:EXPLAIN  select * from user;

  分析結果,確認查詢語句是否使用索引,使用索引的類型級別是什麼? 連接類型儘可能最佳類型

表的連接類型最佳類型---最差類型順序爲:

system:系統表,表中只有一行數據;

const: 常量, 單表主鍵或者唯一鍵查詢條件,最多隻會有一條記錄匹配,由於是常量,實際上只須要讀一次;

eq_ref :  表連接查詢,查詢條件是主表主鍵或者唯一鍵,最多隻會有一條匹配結果,一般是通過主鍵或唯一鍵索引來訪問,使用“=”操作符號;

ref :     表連接查詢,查詢條件使用普通索引,使用“=”,“<=>”操作符;

ref_or_null : 同ref,但是查詢條件包含NULL值的行

index_merge: 該類型表示使用了索引合併優化,查詢中同時使用兩個(或更多)索引,然後對索引結果進行合併,再讀取表數據;

unique_subquery  替換子查詢,唯一索引查找函數,可以完全替換子查詢,效率更高;子查詢中的返回結果字段組合是主鍵或者唯一約束 。

index_subquery    替換子查詢,非唯一索引查找函數,可以完全替換子查詢,效率更高;

range: 只檢索索引範圍掃描,操作符 =、<>、<、<=  between in 等等;

index:全索引掃描

ALL:全表掃描最差

2.2索引對查詢速度的影響

mysql提升性能最有效的方式:對數據庫設計合理的索引;沒有索引,查詢語句會掃描表中所有記錄,在數據量比較大情況下,這樣查詢速度比較慢,使用索引,查詢語句可以根據索引快速定位待查詢的記錄,從而減少查詢的記錄數,達到提高查詢速度的目的;

2.3使用索引查詢

2.3.1使用like關鍵字查詢語句,like查詢如果第一個字符是“%”,不會使用索引

2.3.2使用多列索引的查詢語句 ,最左匹配,多列索引,查詢條件中只有第一個字段被使用,索引纔會生效

2.3.3使用or關鍵字查詢語句,只有前後兩個條件中都是索引時候,查詢纔會使用索引;

總結:

   a.儘量在where order by涉及的列,建立索引

   b.應儘量避免在 where 子句中使用 != 或 <> 操作符,否則將引擎放棄使用索引而進行全表掃描

   c.in 和 not in 也要慎用,否則會導致全表掃描,例如字段是char 傳整型數組

   d.如果在 where 子句中使用參數,也會導致全表掃描,  應儘量避免在 where 子句中對字段進行表達式操作,這將導致引擎放棄使用索引而進行全表掃描,應儘量避免在where子句中對字段進行函數操作,這將導致引擎放棄使用索引而進行全表掃描等

  e. mysql   is null 走索引,is not null是不走索引的

2.3.4 優化子查詢

 子查詢可以使得查詢語句很靈活,但是執行效率不高,因爲mysql會爲內層查詢建立臨時表,使用完畢撤銷,這樣會影響性能,單庫情況下可以用連接查詢代替;

三、優化數據庫結構

儘可能遵循數據庫設計範式,但是有些情況下,反範式設計往往更合適,實踐出真知

3.1  將字段很多的表分解成多個表【可以將經常使用的字段和不經常使用的字段分別存儲】

3.2 增加中間表【新建中間表,將需要經常聯合查詢的數據,放入中間表,進行查詢優化】

3.3 增加冗餘字段【冗餘存儲字段,可以減少的連接查詢】

3.4 優化插入記錄的速度

a.空表批量導入數據,可以禁用索引和唯一性檢查,導入後再新建索引

b.批量導入數據

c.使用load data  infle批量導入,禁用唯一檢查、外鍵檢查

3.5 分析表、檢查表、優化表

mysql提供的語句,分析表主要分析關鍵字的分佈,檢查表檢查表是否存在錯誤、優化表消除刪除揮着更新造成的空間浪費

四、優化mysql服務器

4.1優化服務器硬件

   配置較大內存,通過增大系統緩衝器容量,使得數據在內存停留的時間更長,已減少磁盤IO

   合理分佈磁盤I/O,把磁盤I/O分散在多個設備上,以減少資源競爭,提高並行性處理。

   配置高速磁盤系統,減少系統讀盤等待時間,提高響應速度。

   配置多處理器,mysql是多線程的數據庫,多處理器可以同時執行多個線程。

4.2優化mysql參數,提高系統資源利用率

 key_buffer_size表示索引緩衝區大小

table_cache  標識同時打開的表樹

query_cache_size 查詢緩存區,和query_cache_type使用

sort_buffer_size 排序緩存區大小

read_buffer_size 表示每個線程掃描表分配緩衝區大小

read_rnd_buffer_size 每個線程保留緩衝區大小

innodb_buffer_pool_size innoDB表和索引的最大緩存

max_connections  數據庫的最大連接數

innodb_flush_log_at_trx_commit  表示緩衝區的數據寫入日誌文件

back_log      表示mysql暫時停止回答新請求之前的短時間內,多少個請求會被存在堆棧中

interactive_timeout  服務器在關閉連接前等待行動的秒數

sort_buffer_size  每個需要進行排序的線程分配的緩存區的大小

thread_cache_size 表示可以服用的線程的數量

wait_timeout  表示服務器在關閉一個連接時等待行動的秒數;

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章