MYSQL的一些總結

索引

索引和事務都需要先理解它的文件系統

MYSQL將表的存儲空間劃分爲索引段與數據段,見下圖。數據段再次被分割爲  段->區->頁->行。每個頁中會包含多行數據。頁大小可以調整,但區大小會被固定爲1M,所以如果需要對頁大小進行定製,需要遵循大小控制爲2的倍數。每個行都是一條記錄,它除了保存自己的列值以外,還包含行首數據,它記錄了行中的:不定長字段長度記錄、NULL字段標記、下一行記錄位置、數據總長度、刪除標記、事務ID、回滾信息、隱藏主鍵(主鍵未指定時)等。回到頁,當需要數據頁中的數據時,數據頁會完整的讀取,並緩存到內存中。頁作爲最小文件讀取的單元,它會同樣包含一些信息,包括記錄地址、記錄數量、目錄、未使用空間等。

mysql默認會使用主鍵創建聚簇索引,普通索引的值則只保存對主鍵的引用,因此當查詢條件不完全在索引中時,將會再次通過主鍵找到數據行(俗稱回表),這樣可以保證數據條目存儲位置發生變化時,只需要更新主鍵索引即可。 所以B-Tree將不適合作爲索引的數據結構(它的所有節點都包含了數據條目),B+Tree由於非葉子節點不保存數據,那麼非葉子節點佔用數據塊就小,容易緩存到內存中。索引會指向該記錄所在的頁,當訪問的頁不在內存中時,會先完整讀取出,然後根據頁首信息,找到需要的記錄。

相比主鍵使用的聚簇索引,mysql的普通索引可以定製索引,B+Tree索引、HASH索引 。區別在於數據結構,B+Tree索引由於使了二叉樹,在檢索時可以使用索引來排序,可以使用<>範圍查詢。HASH其結構特點,索引是一個HASH數組,每個HASH可是一行數據的主鍵,或多個主鍵的列表。

最左匹配原則

以B+Tree爲索引方式使用多列聯合進行索引時,如,A B C 三個字段順序組成的索引,如果在查詢時僅提供了A與C的值,缺少B,那麼整個語句在匹配到索引A後就會停止匹配(此處還有疑問,按理解應該可以全掃B節點),索引效率較低。如果我們對B使用了範圍查詢,同樣也會在匹配到索引A就停止匹配。B+Tree的數據結構我們可以對它的葉子節點進行遍歷就可以拿到有序數據,當我們語句匹配到A、B兩個索引時,就可以使用C進行排序。

索引空間

上文中的文件結構我們知道索引是有大小的,mysql正常情況下會使用4級的節點,正常情況下4個級別的所有節點都需要緩存到內存中以提升性能,但如果內存不足以緩存完整的節點時,那麼部分節點將會被逐出內存緩存,在遇到多個查詢時頻繁從硬盤中讀取與內存淘汰,性能下降,所以索引數量不是越多越好。

 

QA:

1. 索引後排序規則

假設有A,B,C索引,where A=? and B=? order by C  可以使用索引,where A=? and B>? order by C 無法使用索引

2. 全表掃描性能

業務常有全表掃描需求,比如建立搜索引擎數據、批量更新狀態等等,在多種條件全表掃描場景下單純的增加索引已經無法滿足需求了,建議使用主鍵排序與分段掃描。這樣分頁查詢後,每一行數據僅會讀取一次。

3. 索引數據格式

不建議使用長文本作爲索引,如果確實存在必要,也需要減少索引長度。主鍵更不適合使用文本,由於文本存儲空間大,其他索引在構建時會保存對主鍵的引用,這樣同樣行數索引佔據內存空間會加大,內存不足時會淘汰,會增加對硬盤的訪問。

事務

待補充

 

連接

待補充

QA:

1. wait_timeout參數:

該參數經常會導致小型工程的穩定性。它代表連接長時間空閒的的情況下是否會失效掉。一些博客經常會設置此值到長期不失效,明顯存在誤導。

除了在數據庫中設定合理的值,也需要在連接池也設定合理的值,避免某些連接長時間空閒後,mysql已經失效了連接但應用程序卻仍然使用它從而出現異常。常見連接池:

C3P0   idleConnectionTestPeriod  爲 wai_timeout的50%

DBCP   timeBetweenEvictionRunsMillis 爲 wai_timeout的50%

proxool   maximum-connection-lifetime 小於 wai_timeout

druid   removeAbandonedTimeout  小於 wai_timeout

 

分庫分表

1.唯一ID生成

    由於聚簇索引的原理,我們在生成唯一ID時儘可能的遵守後生成的ID要比前面的ID大的規則,這樣在插入時將會是有序的,有序的唯一ID。唯一ID生成分兩種,一種是單點生成;一種是統一規則生成。單點是可以利用一個MYSQL實例(或redis等其他數據庫),通過原子操作來一維護一個數據行,行數據內記錄最新的ID,每次需要新的ID時更新數據ID,優化後,將每次更新的步進從1調整到合理的數值來降低對數據行的訪問,減少訪問衝突。第二種規則經典實現時雪花算法,將一個64位的二進制數字分段,第一段代表以某個時間開始後的毫秒(秒/分鐘)數,第二段代表機器唯一ID(或機房-機器),第三段程序內存自增變量。每一段的單位和長度可以根據規模自行設計。、

    單點生成方式缺點是單點故障引起的不可用問題,但可以使用主備實例來容災,或者使用zookeeper等分佈式協調服務提升服務可用性。統一規則生成則有ID過大,可讀性較差的問題,不過如果能準確預估業務規模,減少每一段的長度來縮小數字長度。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章