理解inode
853
2025-03-31
1 Mysql物理數據模型
每一行數據都是放在數據頁,按數據頁為單位把磁盤上的數據加載到內存的緩存頁。也是以頁為單位,將緩存頁的數據刷入磁盤上的數據頁。
表、行和字段是邏輯上的概念
表空間、數據區和數據頁是物理概念。這些東西對應到Mysql在磁盤上的一些物理文件。
SQL語句僅指定查詢或更新哪個表的哪些數據,那它是怎么知道:
這些數據在哪個表空間?哪個數據區?哪些數據頁?對應MySQL節點的哪些磁盤文件?
2 為何不直接更新磁盤數據?
來個請求就直接對磁盤文件進行隨機讀寫,然后更新磁盤文件里的數據,執行請求性能必然極差。因為磁盤隨機讀寫性能極差,所以MySQL才設計了這套機制,通過在內存里更新數據,然后寫redo log及事務提交,后臺線程不定時地刷新內存數據到磁盤文件。
這樣每個更新請求,基本都是更新內存,然后順序寫日志文件,這兩種操作性能都是很高的。
3 數據頁的意義
執行update之類的SQL時,必然涉及數據更新,此時對數據不是直接更新磁盤文件,而是要把磁盤上的一些數據加載到內存,然后對內存里的數據進行更新,同時寫redo log到磁盤。
難道每次都是把磁盤里的一條數據加載到內存里去更新,然后下次要更新別的數據時,再從磁盤里加載另外一條數據到內存?這樣每次一條條數據加載到內存里更新,效率太低!
為此,InnoDB引入數據頁:將數據組織成一頁頁的,每頁16K,然后每次加載磁盤數據到內存時,至少加載一頁甚至多頁的數據:
假設執行:
update xxx set xxx=xxx where id=1
則此時會將id=1這條數據所在的一頁數據都加載到內存,這頁的數據里可能還包含id=2,id=3的數據。
更新完id=1的數據后,接著更新id=2的數據,那此時就不用再讀磁盤里的數據了,因為id=2本就和id=1同頁,之前這頁數據就已被加載到內存,所以此時,直接更新內存里的數據頁中的id=2這條數據即可。
磁盤和內存間的數據交換通過數據頁來執行,包括內存里更新后的臟數據,刷回磁盤時,也是至少一個數據頁刷回去。
因此,我們就能一直在內存里更新各種數據,當I/O線程把內存里的臟數據刷到磁盤時,也是以數據頁為單位刷回。
4 MySQL磁盤如何存儲一行數據?
對一個表,可指定其行存儲的格式,比如這里用COMPACT格式:
CREATE TABLE table_name (columns) ROW_FORMAT=COMPACT ALTER TABLE table_name ROW_FORMAT=COMPACT
建表時,就可指定行存儲格式,后續也能修改。
COMPACT行存儲格式下,每行數據實際存儲時,格式如下:
變長字段的長度列表,null值列表,數據頭,column01的值,column02的值,column0n的值......
對于每行數據,存儲時都會有一些頭字段對這行數據進行描述,再放上這一行數據每一列具體值,這就是所謂的行格式。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。