mysql查詢效能優化之二

2021-09-02 11:55:00 字數 1947 閱讀 5705

1 union的限制

有時mysql無法將限制條件從外層下推到內層,這使得原本能夠限制部分返回結果的條件無法應用到內層

查詢的優化上。

如果希望union的各個子句能夠根據limit只取部分結果集,或者希望能夠先排好序在

合併結果集的話,就需要在union的各個子句中分別使用這些子句。

例如 想將兩個子查詢結果聯合起來,然後再取前20條記錄,那麼mysql會將兩個表都存在臨時表裡

再取出前20條。這是乙個糟糕的設計,我們可以在每個子查詢裡分別只取出limit

合適的記錄,把較小的資料放在臨時表裡。

2 並行查詢

mysql 無法利用多核特性來並行執行查詢。不需要花時間在這方面。

3 雜湊關聯

現在mysql還不支援雜湊關聯,我們可以取現救果,建立自定義雜湊索引。

4 鬆散索引掃瞄

mysql不支援鬆散索引掃瞄,也就無法按照不連續的方式掃瞄乙個索引。通常mysql的索引掃瞄需要先定義乙個起點和終點,即使

需要的資料只是這段索引中很少的幾個,mysql仍需要掃瞄這段索引中每乙個條目。

假如我們有(a,b) 索引,where b between 2 and 40 ,因為索引的最左字首是a ,但是在查詢中只指定了字段b,所以無法使用這個索引,

只有通過全表掃瞄找到匹配的行。

5 最大值和最小值優化

對於max() 和 min() mysql 優化的並不好,我們可以通過例子說明:

在產品表中大概存在17000件產品,已知產品id prod_id 是索引列,現在需要查詢出名字為 '奢華黑' 的最小產品id

通常情況下,我們會使用sql select min(prod_id) from ls_prod where name = '奢華黑' 來執行查詢。

這時候我們來檢視執行時間 0.027s,這個時間看起來並不影響使用者體驗,是在接受的範圍內,但是,隨著產品庫的增加,這一數值急劇

飆公升,在資料量達到百萬級別的時候,最慢可以達到 17s,在條件更差的機器上可能表現更差,這絕對是不可忍受的。

由於name列上並沒有索引,因此mysql會進行一次全表掃瞄,如果mysql能夠進行主鍵掃瞄,那麼理論上mysql找到第乙個滿足條件的

記錄的時候,就是我們需要找的最小值了,因為主鍵是嚴格按照prod_id的大小順序來排序的,但是mysql現在只做全表掃瞄。

乙個曲線的優化辦法是移除min函式,然後使用limit來將查詢重寫

select prod_id from ls_prod use index(primary) where name = '奢華黑' limit 1;

這個策略可以讓mysql掃瞄盡可能少的記錄數。 可能這條sql並不符合你的審美觀,但是mysql並不能一眼看出我們想要最小的值

有時候為了獲取更高的效能,我們不得不放棄一些原則。

6 在同一張表上查詢和更新

mysql 不允許對同一張表同時進行查詢和更新,這並不是優化器的限制,如果清除mysql是如何執行查詢的,就可以避免這種情況。

7 mysql提示

mysql的提示可以幫助我們選擇比較優秀的執行計畫

作者寫道 我們應該盡可能的避免使用 for update 和 lock in share mode 這類提示。shift! 我的架構師告訴我盡可能的使用這類

足以看出這個架構師是一坨屎!mysql 5.0和更新版本會預設給記錄新增這類提示,由於很容易造成伺服器的鎖爭用,所以應該盡可能的避免使用這類

提示。use index 、ignore index 、force index

這幾個提示會告訴優化器使用或者不使用那些索引來查詢記錄,在mysql 5.1和後期的版本可以通過新增選項for order by和for group by來

指定是否對排序和分組有效。force index 和 use index 基本相同,在優化器選擇了錯誤的索引或者因為某些原因使用了另乙個索引的

時候,可以使用這類提示。

ORACLE SQL效能優化之二

oracle在多表查詢時,選擇合適的基礎表進行查詢,sql效率會比較高!所謂基礎表,是指在排在from後面的表列當中,最後乙個位置的表稱為基礎表。oracle解析器在處理from子句時,會從from後面的最後乙個表開始向前依次連線查詢 如selec t a.name b.code,c.content...

mysql查詢效能優化 MySQL 查詢效能優化

在日常開發中,程式設計師寫的最多的除了bug之外,應該算是sql語句了。sql的質量影響了程式的響應速度,只有利用mysql的特性,才能讓mysql更有效的執行查詢sql,充分發揮mysql的優勢,並避開它的弱點。為什麼查詢速度會慢?在編寫sql之前,需要清楚一點 真正重要的是響應時間。如果我們把查...

MySQL之查詢效能優化二

本文將會深入的扒一扒msyql查詢的流程,也會講到一些mysql術語,如 快取,語法解析器,預處理,執行計畫,查詢優化器,另外還會講一講mysql複雜查詢的基礎 關聯 查詢快取 在解析乙個查詢語句之前,如果查詢快取是開啟的,那麼mysql會優先檢查這個查詢是否命中查詢快取中的資料 查詢優化處理 查詢...