首頁  >  文章  >  資料庫  >  SQL效能最佳化

SQL效能最佳化

王林
王林原創
2019-08-19 10:30:393249瀏覽

前言:今天為大家介紹一個比較重要的問題,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 a8093152e673feb7aba1828c43532094 != 

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn