慢查詢:查詢分析查詢速度慢的原因
資料訪問:優化查詢過程中的資料訪問
長難句:優化長難的查詢語句
特定型別:優化特定型別的查詢語句慢查詢日誌:裡面會記錄那些比較慢的日誌,可以使用pt-query-digest工具進行分析
explain語句:可以分析單條語句的查詢效率
show profile、show status、show processlist等語句:查詢語句執行慢的各種情況以及訊息情況或其它
記錄慢查詢日誌:裡面記錄了那些比較慢的查詢
分析查詢日誌:不要直接開啟慢查詢日誌進行分析,這樣比較浪費時間和精力,可以使用pt-query-digest工具進行分析
使用show profile:set profiling=1;開啟,伺服器上執行的所有語句會檢測消耗的時間,存到臨時表中
show profile for query 臨時表id:可以查詢每條profile臨時表中記錄花費的時間
使用show status:show status會返回一些計數器,show global status檢視伺服器級別的所有計數
使用show processlist:觀察是否有大量執行緒處於不正常的狀態或者特徵
使用explain:分析單條sql語句
盡量只取需要的行和列:行方面用索引,列方面用需要的
訪問資料太多導致查詢效能下降
確定應用程式是否在檢索大量超過需要的資料,可能是太多行或列
確認mysql伺服器是否在分析大量不必要的資料行
是否在掃瞄額外的記錄
使用explain來進行分析,如果發現查詢需要掃瞄大量的資料但只返回少數的行,可以通過如下技巧去優化:
使用索引覆蓋掃瞄,把所有用的列都放到索引中,這樣儲存引擎不需要回表獲取對應行就可以返回結果
改變資料庫和表的結構,修改資料表正規化
重寫sql語句,讓優化器可以以更優的方式執行查詢
避免使用如下sql語句
1、查詢不需要的記錄:使用limit解決
2、多表關聯返回全部列:指定a.id,a.name,b.age
3、總是取出全部列:select*會讓優化器無法完成索引覆蓋掃瞄的優化
4、重複查詢相同的資料,可以快取資料,下次直接讀取快取
1、查詢不需要的記錄:使用limit解決
2、多表關聯返回全部列:指定a.id,a.name,b.age
3、總是取出全部列:select*會讓優化器無法完成索引覆蓋掃瞄的優化
4、不用快取:重複查詢相同的資料,可以快取資料,下次直接讀取快取
1、查詢不需要的記錄:使用limit解決
2、多表關聯返回全部列:指定a.id,a.name,b.age
3、總是取出全部列:select*會讓優化器無法完成索引覆蓋掃瞄的優化
4、重複查詢相同的資料,可以快取資料,下次直接讀取快取
切分查詢:將乙個大的查詢分為多個小的相同的查詢:一次性刪除1000萬的資料要比一次刪除1萬,暫停一會的方案更加損耗伺服器開銷
分解關聯查詢:可以將一條關聯語句分解成多條sql來執行
切分查詢:將乙個大的查詢分為多個小的相同的查詢:一次性刪除1000萬的資料要比一次刪除1萬,暫停一會的方案更加損耗伺服器開銷
分解關聯查詢
可以將一條關聯語句分解成多條sql來執行
讓快取的效率更高
執行單個查詢可以減少鎖的競爭
在應用層做關聯可以更容易對資料庫進行拆分
查詢效率會有大幅提公升
較少冗餘記錄的查詢
內部查詢快,和客戶端互動慢:mysql內部每秒能掃瞄記憶體中上百萬行資料,相比之下,響應資料給客戶端就要慢得多
多個簡單查詢有必要:使用盡可能少的查詢是好的,但是有時將乙個大的查詢分解為多個小的查詢是很有必要的優化count(*)查詢:count(*)中的*會忽略所有的列,直接統計所有列數,因此不要使用count(列名)
優化關聯查詢:確定on或者using子句的列上有索引;確保group by和order by中只有乙個表中的列,這樣mysql才有可能使用索引
優化子查詢:盡可能使用關聯查詢來替代
優化group by和distinct:這兩種查詢均可使用索引來優化,是最有效的優化方法
優化count(*)查詢
count(*)中的*會忽略所有的列,直接統計所有列數,因此不要使用count(列名)
myisam中,沒有任何where條件的count(*)非常快;當有where條件,myisam的count統計不一定比其他表引擎快
可以使用explain查詢近似值,用近似值替代count(*)
增加彙總表
使用快取
優化關聯查詢
確定on或者using子句的列上有索引
確保group by和order by中只有乙個表中的列,這樣mysql才有可能使用索引
優化子查詢
盡可能使用關聯查詢來替代
優化group by和distinct
這兩種查詢均可使用索引來優化,是最有效的優化方法
關聯查詢中,使用標識列進行分組的效率會更高
如果不需要order by,進行group by時使用order by null,mysql不會再進行檔案排序
with rollup超級聚合,可以挪到應用程式處理
優化limit分頁
limit偏移量大的時候,查詢效率較低,可以記錄上次查詢的最大id,下次查詢時直接根據該id來查詢
優化union查詢
union all的效率高於union
18 MySQL加鎖處理分析
by何登成 by何登成 這篇部落格提到了乙個無比微妙的死鎖情況,涉及innodb死鎖預防。這篇文章從乙個簡單的sql語句delete from t1 where id 10 分析在各種情況下的加鎖情況。以下為這篇文章的目錄,感謝何博士的分享。1 背景 1 1.1 mvcc snapshot read...
18 mysql內建功能 儲存過程
儲存過程包含了一系列可執行的sql語句,儲存過程存放於mysql中,通過呼叫它的名字可以執行其內部的一堆sql 使用儲存過程的優點 1.用於替代程式寫的sql語句,實現程式與sql解耦 2.基於網路傳輸,傳別名的資料量小,而直接傳sql資料量大使用儲存過程的缺點 1.程式設計師擴充套件功能不方便補充...
MySQL必知必會 18MySQL更新資料
mysql必知必會 18mysql更新資料,基本的update語句由3部分組成,分別是 要更新的表 列名和它們的新值 確定要更新行的過濾條件。set子句設定cust email列為指定的值 在更新多個列時,只需要使用單個set命令,每個 列 值 對之間用逗號分隔 最後一列之後不用逗號 update語...