title: mysql 是怎樣執行的(二)——資料庫檔案系統
date: 2019-3-18 12:34:39
tags: [mysql]
categories: 掘金小冊
keywords: mysql
photos:
檢視資料目錄:show variables like 'datadir';
區分mysql安裝目錄與資料目錄
1.表結構,儲存在 表名.frm 中。
2.資料,根據引擎不同,方式不同
innodb其實是使用頁為基本單位來管理儲存空間的,預設的頁大小為16kb。檢視是虛擬的表,一條查詢的結果集。儲存檢視的時候是不用存資料的,只需要儲存其資料結構,會被儲存到對於資料庫下,對於innodb儲存引擎來說,每個索引都對應著一棵b+樹,該b+樹的每個節點都是乙個資料頁,資料頁之間不必要是物理連續的,因為資料頁之間有雙向鍊錶來維護著這些頁的順序。
innodb的聚簇索引的葉子節點儲存了完整的使用者記錄,也就是所謂的索引即資料,資料即索引。
檢視名.frm
檔案。
伺服器程序檔案:程序id
伺服器日誌檔案:各種日誌
預設/自動生成的ssl和rsa證書和金鑰檔案:用於c/s通訊
1.db名與table名不得超過檔案系統允許的最大長度
2.特殊字元:在上述兩名字中,存在除數字和拉丁字母以外的所有字元,都對映成@編碼值,如』test?'表會建立,『[email protected]』
3.資料檔案和索引檔案的大小都受限於檔案系統
抽象概念,可想象成包含若干個資料頁的池子
作用:表空間中頁太多,使用區便於管理
第乙個組開頭3個頁型別是固定的,比較特殊,分別是:
fsp_hdr:描述表空間的一些屬性,每個表空間開頭唯一的頁ibuf_bitmap: 儲存本組關於insert buffer資訊
inode:
除第乙個組外,每個組開頭有2個頁型別是固定的
xdes:extent descriptior,用於登記本組256個區的屬性
ibuf_bitmap
場景:當資料量很大,頁有很多的時候,n次插入後。通過雙向鍊錶連線的兩個邏輯上的頁,其物理距離可能相差很遠。若使用範圍查詢,只需找到最左和最右記錄,而中間的記錄通過雙向鍊錶掃瞄,使用的是隨機i/0(很慢),我們希望其物理位置也最好相鄰,可使用順序io
區: 物理位置上連續的64個頁,在資料量大的時候,分配空間按照區(1mb)分配而不是頁(16kb),公升至數個區的分配。(好處:減少隨機i/0,壞處:空間預分配的浪費,以空間換時間)
段:存放葉子或非葉子節點 的區(和零散頁)的集合
因為順序查詢,是同一層的雙向鍊錶間的查詢,我們不希望 葉子節點和非葉子節點混到一起了。所以乙個索引有
場景:若資料少,豈不是乙個索引要乙個區,1mb葉子段,1mb非葉子段?這麼浪費?所以有了碎片區
碎片區(fragment)
乙個區中,不是所有頁都是為了儲存同乙個段。而是有的頁是段a,有的是段b。
可以理解將碎片區理解為:放置了不同段頁面的區?
當段中資料較少時,插入過程使用的是表空間鍊錶
檢視是否有free_frag碎片區,有則插入資料
否則申請free空閒區,並將其狀態變為碎片區
直到將碎片區變為full_frag
當段中資料已經佔滿32個零散的頁,再使用表空間鍊錶遍歷,效率就低了,
通過段中的,free鍊錶,申請完整的區(空閒區)
每個區的頭部 都有xdes entry,通過它能將同種類別的區連線成鍊錶。便於查詢
隸屬於表空間的鍊錶
free鍊錶
free_frag鍊錶
full_frag鍊錶
隸屬於 段 的鍊錶
free鍊錶:同乙個段中的 free區
not_full鍊錶:同乙個段中,仍然有碎片空間的區組成
full鍊錶:同乙個段中,沒有空閒空間的區組成
彙總:每個索引有兩個段(葉子段,非葉子段),每個段需要三種型別頁鍊錶(free,not_full,full),另外有三個隸屬於表空間的鍊錶。
基節點:用於存放這些鍊錶的資訊(頭節點位置,尾節點位置,節點數)
段雖然是邏輯概念,但是每個段都有乙個inode entry記錄段的資訊
資料庫索引是怎樣工作的?
我們通過乙個簡單的例子來開始教程,解釋為什麼我們需要資料庫索引。假設我們有乙個資料庫表 employee,這個表有三個字段 列 分別是 employee name employee age 和employee address。假設表employee 有上千行資料。現在假設我們要從這個表中查詢出所有名...
MySQL 什麼是資料庫 資料庫01
資料庫 db,database 概念 資料倉儲,軟體,安裝在作業系統 作用 儲存和管理資料 關係型資料庫 sql mysql,oracle,sql server 通過表和標誌見,行和列之間的關係進行資料的儲存 非關係型資料庫 nosql not only redis,mongdb 非關係型資料庫,物...
什麼是MySql資料庫
通常意義上,資料庫也就是資料的集合,具體到計算機上資料庫可以是儲存器上一些檔案的集合或者一些記憶體資料的集合。我們通常說的mysql資料庫,sql server資料庫等等其實是資料庫管理系統,它們可以儲存資料,並提供查詢和更新資料庫中的資料的功能等等。根據資料庫如何儲存資料和如何運算元據的實現機制不...