php面試專題 18 MySQL查詢優化考點

2022-03-24 04:50:54 字數 2675 閱讀 6466

慢查詢:查詢分析查詢速度慢的原因

資料訪問:優化查詢過程中的資料訪問

長難句:優化長難的查詢語句

特定型別:優化特定型別的查詢語句慢查詢日誌:裡面會記錄那些比較慢的日誌,可以使用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語...