大家好,今天繼續我們Inndob文件系統的學習,首先我們要知道Innodb屬于整個MYSQL體系中處于最底層的存儲層(client->server->storage),然后嘞,要對innodb整體的體系結構有一個全局的概念,如下圖:
下面我們對上圖的模塊簡單介紹一波,讓大家對innodb有一個更清晰的認識。
1、?Handler API:這個模塊主要是用來和server層進行交互的,提供了一些比如save、delete、query等api供server層調用,不同的存儲引擎各自有不同的實現。
2、中間虛線上半部分是邏輯層,每個訪問請求都會產生事務,事務處理都會產生鎖(表鎖、行鎖、間隙鎖、臨建鎖等),操作對象是表、索引、B+tree等。對數據頁面的訪問需要保證讀寫一致性,需要讀寫鎖(物理鎖),為了高效定位和管理‘頁’,需要用到文件管理系統。
3、Innodb為了保證存儲的效率,在邏輯處理層和物理層之間是有一層buffer緩沖區的,這里主要是指日志緩沖區和Innodb_buffer_pool緩沖區,和其他中間件的設計原則類似,要想保證性能,首先寫pageCache,再順序寫磁盤,這是決定一個帶有存儲功能中間件性能關鍵點。
4、innodb_buffer_pool是決定mysql性能的核心,mysql對數據絕大部分的操作都是先在此內存中進行,然后再以同步或異步的方式寫入到磁盤上。畢竟操作內存的速度指定比直接操作磁盤要快很多,redis的設計就是一個很好的實踐。
5、每個表可以單獨一個ibd文件(獨立表空間)也可以多個表一個ibd文件(共享表空間),默認是一個表一個。然后這里面存的是啥玩意呢?存的是B+tree數據、索引、插入緩存等信息。其余的信息,如列、屬性等信息還是存儲在默認的ibdata1文件里面。對于B+tree的結構大家應該也有一個大致的了解吧。首先基于INNODB存儲引擎的表一般都是通過主鍵為索引值構建的聚簇索引樹(所以一般我們建表都要指定主鍵,不指定的話INNODB也會幫你生成一個隱藏ROW_ID作為主鍵,所以我們在設計表結構的時候最好指定一個主鍵,不然的話會影響數據插入性能,插入數據需要生成ROW_ID,而生成的ROW_ID是全局共享的,并發會導致鎖競爭,影響性能;mysql生成的自增主鍵大小是有上限的0~2^48-1,超過上限之后會出現主鍵沖突錯誤)。
生成的這個棵B+tree樹擁有全量數據,數據都順序的存放在葉子節點(每個節點不超過16k,超過的會放到溢出頁,葉子節點只放一個引用地址),一般3層葉子節點即可存放2千萬數據了,4層一般上億條數據,通過穩定的IO次數即可查到指定數據。
最后,索引是方便查詢的,索引列的數據不適合放大的,它占用的空間一多,那么B+ tree一層中能放的個數就越少。索引列一多,插入就越慢,如果沒有索引,插入一行時只需要對主鍵進行排序即可。如果有很多列都有索引,那么插入時,就要做很多次排序。
你是否還在尋找穩定的海外服務器提供商?創新互聯www.cdcxhl.cn海外機房具備T級流量清洗系統配攻擊溯源,準確流量調度確保服務器高可用性,企業級服務器適合批量采購,新人活動首月15元起,快前往官網查看詳情吧
文章名稱:MYSQL底層原理4-Innodb文件系統的基本結構-創新互聯
網站網址:http://newbst.com/article28/dijjcp.html
成都網站建設公司_創新互聯,為您提供網站改版、品牌網站建設、網站營銷、關鍵詞優化、動態網站、做網站
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯