如何寫出高效能SQL

2021-10-11 18:45:11 字數 1660 閱讀 8416

在編寫一條查詢語句的時候,可以依據你要查詢資料表的資料總量,估算一下這條查詢大致需要遍歷多少行資料:

如果遍歷行數在百萬以內的,只要不是每秒鐘都要執行幾十上百次的頻繁查詢,可以認為是安全的。

遍歷資料行數在幾百萬的,查詢時間最少也要幾秒鐘,你就要仔細考慮有沒有優化的辦法。

遍歷行數在千萬左右,是 mysql 查詢的乙個坎兒。mysql 中單個表資料量,也要盡量控制在一千萬條以下,最多不要超過二三千萬這個量級。原因也很好理解,對乙個千萬級別的表執行查詢,加上幾個 where 條件過濾一下,符合條件的資料最多可能在幾十萬或者百萬量級,這還可以接受。但如果再和其他的表做乙個聯合查詢,遍歷的資料量很可能就超過千萬級別了。所以,每個表的資料量最好小於千萬級別。

絕大多數情況下,我們編寫的查詢語句,都應該使用索引,避免去遍歷整張表,也就是通常說的,避免全表掃瞄。你在每次開發新功能,需要給資料庫增加乙個新的查詢時,都要評估一下,是不是有索引可以支撐新的查詢語句,如果有必要的話,需要新建索引來支援新增的查詢。

增加索引付出的代價是,會降低資料插入、刪除和更新的效能。這個也很好理解,增加了索引,在資料變化的時候,不僅要變更資料表裡的資料,還要去變更每個索引。所以,對於更新頻繁並且對更新效能要求較高的表,可以盡量少建索引。而對於查詢較多更新較少的表,可以根據查詢的業務邏輯,適當多建一些索引。

在 mysql 中使用執行計畫也非常簡單,只要在你的 sql 語句前面加上 explain 關鍵字,然後執行這個查詢語句就可以了。

比如有乙個使用者表,包含使用者 id、姓名、部門編號和狀態這幾個字段:

我們希望查詢某個二級部門下的所有人,查詢條件就是,部門代號以 00028 開頭的所有人。下面這兩個 sql,他們的查詢結果是一樣的,都滿足要求,但是,哪個查詢效能更好呢?

select * from user where left(department_code, 5) = 『00028』;select * from user where department_code like 『00028%』;

我們分別檢視一下這兩個 sql 的執行計畫:

row 列:

mysql 預估執行這個 sql 可能會遍歷的資料行數。第乙個 sql 遍歷了四千多行,這就是整個 user 表的資料條數;第二個 sql 只有 8 行,這 8 行其實就是符合條件的 8 條記錄。顯然第二個 sql 查詢效能要遠遠好於第乙個 sql。

type 列:

表示這個查詢的訪問型別。all 代表全表掃瞄,這是最差的情況。range 代表使用了索引,在索引中進行範圍查詢,因為第二個 sql 語句的 where 中有乙個 like 的查詢條件。如果直接命中索引,type 這一列顯示的是 index。如果使用了索引,可以在 key 這一列中看到,實際上使用了哪個索引。

在開發階段,衡量乙個 sql 查詢語句查詢效能的手段是,估計執行 sql 時需要遍歷的資料行數。遍歷行數在百萬以內,可以認為是安全的 sql,百萬到千萬這個量級則需要仔細評估和優化,千萬級別以上則是非常危險的。為了減少慢 sql 的可能性,每個資料表的行數最好控制在千萬以內。 索引可以顯著減少查詢遍歷資料的數量,所以提公升 sql 查詢效能最有效的方式就是,讓查詢盡可能多的命中索引,但索引也是一把雙刃劍,它在提公升查詢效能的同時,也會降低資料更新的效能。 對於複雜的查詢,最好使用 sql 執行計畫,事先對查詢做乙個分析。在 sql 執行計畫的結果中,可以看到查詢預估的遍歷行數,命中了哪些索引。執行計畫也可以很好地幫助你優化你的查詢語句。

**:

如何寫出高效能SQL語句

1 首先要搞明白什麼叫執行計畫?執行計畫是資料庫根據sql語句和相關表的統計資訊作出的乙個查詢方案,這個方案是由查詢優化器自動分析產生欀如一條sql語句如果用來從乙個10萬條記錄的表中查1條記錄,那查詢優化器會選擇 索引查詢 方式,如果該錶進行了歸檔,當前只剩下5000條記錄了,那查詢優化器就會改變...

如何寫出高效能DOM?

提高高效能dom就不得不提到回流和重繪,那麼什麼是回流什麼是重繪?回流 對於dom結構中的各個元素都有自己的盒子模型,這些都需要瀏覽器根據各種樣式 瀏覽器的 開發人員定義的 來計算並根據計算結果將元素放到它該出現的位置,這個過程稱為回流。重繪 當各種盒子的位置 大小以及其他屬性,例如顏色 字型大小等...

SQL查詢優化 如何寫出高效能SQL語句

1.查詢的模糊匹配 盡量避免在乙個複雜查詢裡面使用 like parm1 紅色標識位置的百分號會導致相關列的索引無法使用,最好不要用.解決辦法 其實只需要對該指令碼略做改進,查詢速度便會提高近百倍。改進方法如下 a 修改前台程式 把查詢條件的 商名稱一欄由原來的文字輸入改為下拉列表,使用者模糊輸入 ...