sql調優的幾個關鍵點

2022-06-24 16:45:10 字數 2125 閱讀 4430

1.explain

主要看的幾點:

type  查詢級別   

possible_keys   可能用到的索引

key   實際用到的索引

rows   大致掃瞄行數

extra

其中這個掃瞄行數只是乙個近似行數,並不是實際絕對的掃瞄行數

mysql中資料的單位都是頁,mysql又採用了取樣統計的方法,取樣統計的時候,innodb缺省會選擇n個資料頁,統計這些頁面上的不同值,得到乙個平均值,然後乘以這個索引的頁面數,就得到了這個索引的基數。

一般走錯索引都是因為優化器在選擇的時候發現,走a索引沒有額外的代價,比如走b索引並不能直接拿到我們的值,還需要回到主鍵索引才可以拿到,多了一次回表的過程,這個也是會被優化器考慮進去的。

他發現走a索引不需要回表,沒有額外的開銷,所有他選錯索引

我們可以force index強制走正確的索引

2.快取問題

在測試環境自己寫語句 執行時間可能會受到快取的干擾,

每次請求的查詢語句和結果都會以key-value的形式快取在記憶體中的,

如果線上環境快取失效,就會從磁碟io獲取

快取失效比較頻繁的原因就是 當快取的表資料被修改,快取中的整張表都會失效

3.覆蓋索引與聯合索引

盡量使用覆蓋索引,減少一次回表查詢

聯合索引使用過程中遵循的幾個原則保證走索引:

最優作字首

範圍後索引失效

4.普通索引與唯一索引

關鍵點 change buffer 

當需要更新乙個資料頁時,如果資料頁在記憶體中就直接更新,盡量避免了把資料頁從磁碟讀到記憶體這一步

而如果這個資料頁還沒有在記憶體中的話,在不影響資料一致性的前提下,inoodb會將這些更新操作快取在change buffer中,這樣就不需要從磁碟中讀入這個資料頁了。

在下次查詢需要訪問這個資料頁的時候,將資料頁讀入記憶體,然後執行change buffer中與這個頁有關的操作,通過這種方式就能保證這個資料邏輯的正確性。

將資料從磁碟讀入記憶體涉及隨機io的訪問,是資料庫裡面成本最高的操作之一,change buffer因為減少了隨機磁碟訪問,所以對更新效能的提公升是會很明顯的。

將change buffer中的操作應用到原資料頁,得到最新結果的過程稱為merge。

除了訪問這個資料頁會觸發merge外,系統有後台執行緒會定期merge。在資料庫正常關閉(shutdown)的過程中,也會執行merge操作。

change buffer適用於普通索引,

因為唯一索引的寫操作 每次都會把資料頁讀到記憶體判斷是否違反了唯一性,所以根本不用change buffer

change buffer適用於寫多讀少的場景

因為merge的時候是真正進行資料更新的時刻,而change buffer的主要目的就是將記錄的變更動作快取下來,所以在乙個資料頁做merge之前,change buffer記錄的變更越多(也就是這個頁面上要更新的次數越多),收益就越大。這種業務模型常見的就是賬單類、日誌類的系統。

假設乙個業務的更新模式是寫入之後馬上會做查詢,那麼即使滿足了條件,將更新先記錄在change buffer,但之後由於馬上要訪問這個資料頁,會立即觸發merge過程。這樣隨機訪問io的次數不會減少,反而增加了change buffer的維護代價,所以,對於這種業務模式來說,change buffer反而起到了***。

so 得出結論, 建立普通索引還是唯一索引,

首先判斷是否需要保證該欄位唯一性,

在判斷該字段寫多讀少 就用普通索引,讀的頻率多 用唯一索引 避免使用change buffer。

5.字首索引

因為存在乙個磁碟占用的問題,索引選取的越長,占用的磁碟空間就越大,相同的資料頁能放下的索引值就越少,搜尋的效率也就會越低。

如果要檢索的字段很長很長,可以考慮字首索引,

把字段hash為另外乙個欄位存起來建立索引,每次校驗hash值,hash的索引也不大。通過兩次查詢,先查到hash值下所有行,再縮小範圍找到長欄位準確值。

如果要檢索的字段字首區分度不高 可以考慮翻轉 或者 擷取存成新字段 然後建立索引,

可以採用倒序,或者刪減字串這樣的情況去建立我們自己的區分度。

SQL調優之八 關於SQL調優

sql調優是指對未達到預期的sql語句進行診斷和修復 sql調優是乙個反覆的過程,是一步一步的將sql語句的效能提公升到預期的目標。它是對乙個已經實施完成了的應用的問題的解決,相反的,應用設計則是在實施之前,就應該已經設定好了安全和效能的目標。一次典型的調優過程,需要達到以下的其中乙個目的 相對的,...

sql調優技巧

1 避免無計畫的全表掃瞄 如下情況進行全表掃瞄 該錶無索引 對返回的行無人和限制條件 無where子句 對於索引主列 索引的第一列 無限制條件 對索引主列的條件含在表示式中 對索引主列的限制條件是is not null或 對索引主列的限制條件是like操作且值是乙個bind variable或 打頭...

SQL調優命令

命令工具 oracle sql plus 或者cmd sqlplus mmsuser agooy8tt xian 133 64 46 26 是 set autotrace off 不產生autotrace報告,預設設定,查詢按常規執行。set autotrace on statistics 查詢按常...