覆蓋索引的優化點和注意點

2021-10-03 03:30:52 字數 1616 閱讀 3513

金三銀九,雖然收到了疫情的衝擊。但對於即將踏入社會的我們來說很重要的一段時間。在最近準備面試的過程當中發現,其實對於業務系統來說。mysql的線上效能調優經驗又是非常被看重的一件事情。那麼結合我在研究生期間的工作和實習經歷來說,對於mysql的線上調優工作做了一下幾個方面的總結,希望能夠幫助到所有有需要的同學。在這個不一樣的烟花三月當中,一起加油。

關於mysql調優,可能大的思路我們可以主要分為以下幾個部分:索引效能抖動長事務帶來的影響大表的連線查詢優化這幾個方面,今天就來分享以下一些日常生活當中積累的一些思路和原理。

說起索引,我們首先想到的就是新增索引能夠加快我們的查詢,提高服務的能力。但是在索引調優過程中,我們又需要著重注意以下幾個方面的問題:1.建立什麼型別的索引?2.如果發現優化器沒有選擇指定的索引,該如何優化?

覆蓋索引

優點一:避免回表

覆蓋索引的含義是索引項上包含了查詢的全部內容。我們知道,在建立乙個普通的二級索引的時候,底層的索引節點上只包含了索引欄位和id,如果需要其他的資料,我們就需要根據id進行回表操作。這可能就會帶來額外的磁碟io開銷。而如果使用覆蓋索引,我們可以有效的避免回表操作。初次之外,mysql5.6之後對覆蓋索引進行了進一步的優化,即推出了索引下推功能,支援覆蓋索引在必要的回表操作之前根據已有字段進行進一步的篩選,從而減少回表的次數。

再進一步,如果我們的線上資料庫的底層使用的是機械硬碟(機械硬碟的資料讀取需要進行磁碟的轉動和扇區的尋找,因此隨機讀寫的開銷非常大),我們就需要考慮進一步的優化回表時的隨機讀寫。針對這個問題,mysql也給出了相應的解決辦法,即支援mrr(multi-range-read)。mrr可以將回表操作全部暫存在一塊叫做read_rnd_buffer當中,然後進行排序,將有序的id進行回表操作。這樣做的好處有兩個:(1)批處理操作能夠提高效率。(2)能夠將隨機讀寫轉換為順序讀寫進行優化。這對線上業務是機械硬碟的mysql更為友好。

優點二:避免排序

而覆蓋索引除了可以減少回表的次數之外,還可以避免排序。我們知道innodb是基於索引組織結構的,並且底層使用b+樹作為其儲存的資料型別【注1】。因此innodb表中的資料在插入時就是有序的。因此當我們的業務中需要排序的字段上有索引時就可以避免排序操作。而如果沒有索引,innodb引擎則會通過全欄位排序rowid排序,或者mysql5.6之後引入的優先佇列排序演算法進行排序之後返回,在這個過程當中不僅會占用cpu資源,還有可能用到臨時檔案,因此應該在業務當中盡量避免。

優點三:減少維護的索引

我們知道,在innodb當中的每乙個索引都對應著一棵索引樹,並在磁碟當中對應著乙個索引檔案。而當表中業務量大而線上磁碟容量有限的時候,如果可以少維護乙個索引卻能夠達到相同的效果,所帶來的優化也是不容忽視的。那就需要我們在設計覆蓋索引時滿足最左原則【注】通過合理的安排覆蓋索引的位置,我們可以少維護索引。例如 index2(a,b),我們就可以不再單獨維護索引a。

關於SQL優化的幾個注意點

1 sql變數或字段的型別匹配 2 避免複雜的多表關聯 3 使用decode來減少處理時間 4 減少對錶的查詢 5 用not exists替代not in 6 用 替代 7 對於並列條件的解析順序 從後向前。表關聯語句放在最前,將能過濾掉最大記錄數的條件放在最後。8 表連線時的掃瞄順序 從後向前,將...

mysql索引優化知識點

想要了解索引的優化方式,必須要對索引的底層原理有所了解 索引的用處 索引的分類 面試技術名詞 索引採用的資料結構 索引匹配方式 create table staffs id int primary key auto increment,name varchar 24 not null default...

資料庫查詢優化索引的一些注意點

盡量不要在where 條件之後使用函式來作為查詢條件,因為這樣做會使得該查詢欄位的索引失效 在做查詢的時候如果in條件中仍然有select子查詢,那麼我們應該使用連線查詢join代替子查詢,子查詢會很影響查詢的效率 多表查詢時把資料量最大的表最後連線。或者直接將之前資料量較小的表都連線之後在括號外再...