前言:今天為大家介紹一個比較重要的問題,SQL效能優化。
在操作資料庫是如何讓sql語句效率更高是一個非常重要的問題,以下我將為大家總結一下效能最佳化問題。
SQL效能最佳化
1、SELECT 語句務必指明欄位名稱
SELECT * 會增加很多不必要的消耗,(cpu、io、記憶體、網路頻寬);增加了使用覆蓋索引的可能性;
當表結構改變時,前斷也需要更新。所以要求直接在select後面接上欄位名。
2、SQL語句中IN包含的值不要太多
MySQL對於IN做了對應的最佳化,即將IN中的常數全部儲存在一個陣列裡面,而且這個陣列是排好序的。
但是如果數值較多,產生的消耗也是比較大的。對於連續的數值,能用 between 就不要用 in 了;再或使用連接來替換。
3、區分in和exists,not in 和not exists
select * from 表A where id in (select id from 表B)
等價於
select * from 表A where exists(select * from 表B where 表B.id=表A.id)
區分in和exists主要是造成了驅動順序的改變(這是效能變化的關鍵),如果是exists,那麼以外層表為驅動表,先被訪問,如果是IN,那麼先執行子查詢。
所以IN適合外表大而內表小的情況;EXISTS適合外表小而內表大的情況。
4、不建議使用%前綴模糊查詢
例如LIKE “%name”或LIKE “%name%”,這種查詢會導致索引失效而進行全表掃描。但是可以使用LIKE “name%”。
避免隱式類型轉換:
where子句中出現column 欄位的類型和傳入的參數類型不一致的時候發生的類型轉換,建議先確定where中的參數類型
5、對於聯合索引來說,要遵循最左前綴法則
舉列來說索引含有字段id,name,school,可以直接用id字段,也可以id,name這樣的順序,但是name;school都無法使用這個索引。
所以在建立聯合索引的時候一定要注意索引欄位順序,常用的查詢欄位放在最前面
#總結以上建議:
1.避免對索引欄位進行計算操作
2、避免在索引欄位上使用not <> !=
3、避免在索引欄位上使用is null , is not null
3、避免在索引欄位上出現資料型別轉換
4、避免在索引欄位上使用函數
5、避免在建立索引的欄位中使用空白值
6、對與WHERE的語句法則
7、盡量避免在WHERE子句中使用in, not in 或having ,可以使用exist ,not exist 代替in ,not in
8、不要以字元格式聲明數字, 不要以數字格式聲明字元值,否則會使索引無效
#以上是為大家總結的一些問題,更多問題請訪問PHP中文網對應教程:https://www.php.cn/course/list/51/type/2.html
#以上是SQL效能最佳化的詳細內容。更多資訊請關注PHP中文網其他相關文章!