一、性能優化目標
通過合理安排資源,調整系統參數使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 表示服務器在關閉一個連接時等待行動的秒數;