在上文中,我們了解了教你如何利用MySQL學習MongoDB之安裝篇,本文中我們繼續我們的學習之旅,學習其數據存儲結構。
1、MySQL的數據存儲結構
MySQL的每個數據庫都對應存放在一個與數據庫同名的文件夾中,MySQL數據庫文件包括MySQL所建數據庫文件和MySQL所用存儲引擎創建的數據庫文件。
MySQL如果使用MyISAM存儲引擎,數據庫文件類型就包括.frm、.MYD、.MYI
MySQL如果使用InnoDB存儲引擎,數據庫文件類型就包括.frm、ibdata1、.ibd
(1)、數據庫文件:
.frm文件:存儲數據表的框架結構,MySQL數據庫文件名與表名相同,每個表對應一個同名frm文件,與操作系統和存儲引擎無關,即不管MySQL運行在何種操作系統上,使用何種存儲引擎,都有這個文件。除了必有的.frm文件,根據MySQL所使用的存儲引擎的不同(MySQL常用的兩個存儲引擎是MyISAM和InnoDB),存儲引擎會創建各自不同的數據庫文件。
(2)、MyISAM數據庫表文件:
(3)、InnoDB采用表空間:
ibdata1、ibdata2:系統表空間MySQL數據庫文件,存儲InnoDB系統信息和用戶數據庫表數據和索引,被所有表共用;
.ibd文件:單表表空間文件,每個表使用一個表空間文件(file per table),用於存放用戶數據庫表數據和索引;
日志文件:ib_logfile1、ib_logfile2。
2、MongoDB的數據存儲結構
MongoDB對國內用戶來說比較新, 它就像是一個黑盒子,但是如果對於它內部的數據存儲了解多一些的話,那麼將會很快的理解和駕馭MongoDB,讓它發揮它更大的作用。
MongoDB的默認數據目錄是/data/db,它負責存儲所有的MongoDB的數據文件。在MongoDB內部,每個數據庫都包含一個.ns文件和一些數據文件,而且這些數據文件會隨著數據量的增加而變得越來越多。所以如果系統中有一個叫做foo的數據庫,那麼構成foo這個數據庫的文件就會由foo.ns,foo.0,foo.1,foo.2 等等組成,具體如下:
- [root@localhost db]# ll /data/db/
- 總計 196844
- -rw------- 1 root root 16777216 04-15 16:33 admin.0
- -rw------- 1 root root 33554432 04-15 16:33 admin.1
- -rw------- 1 root root 16777216 04-15 16:33 admin.ns
- -rw------- 1 root root 16777216 04-21 17:30 foo.0
- -rw------- 1 root root 33554432 04-21 17:30 foo.1
- -rw------- 1 root root 67108864 04-21 17:30 foo.2
- -rw------- 1 root root 16777216 04-21 17:30 foo.ns
- -rwxr-xr-x 1 root root 6 04-21 17:16 mongod.lock
- -rw------- 1 root root 16777216 04-15 16:30 test.0
- -rw------- 1 root root 33554432 04-15 16:30 test.1
- -rw------- 1 root root 16777216 04-15 16:30 test.ns
- drwxr-xr-x 2 root root 4096 04-21 17:30 _tmp
- [root@localhost db]#
MongoDB內部有預分配表空間的機制,每個預分配的文件都用0進行填充,由於有了這個機制, MongoDB始終保持額外的空間和空余的數據文件,從而有效避免了由於數據暴增而帶來的磁盤壓力過大的問題。
由於表中數據量的增加,數據文件每新分配一次,它的大小都會是上一個數據文件大小的2倍,每個數據文件最大2G。這樣的機制有利於防止較小的數據庫浪費過多的磁盤空間,同時又能保證較大的數據庫有相應的預留空間使用。
數據庫的每張表都對應一個命名空間,每個索引也有對應的命名空間。這些命名空間的元數據都集中在*.ns文件中。
在下圖中,foo這個數據庫包含3個文件用於存儲表和索引數據,foo.2文件屬於預分配的空文件。foo.0和foo.1這兩個數據文件被分為了相應的盤區對應不同的名字空間。
上圖顯示了命名空間和盤區的關系。每個命名空間可以包含多個不同的盤區,這些盤區並不是連續的。與數據文件的增長相同,每一個命名空間對應的盤區大小的也是隨著分配的次數不斷增長的。這樣做的目的是為了平衡命名空間浪費的空間與保持某一個命名空間中數據的連續性。上圖中還有一個需要注意的命名空間:$freelist,這個命名空間用於記錄不再使用的盤區(被刪除的Collection或索引)。每當命名空間需要分配新的盤區的時候,都會先查看$freelist是否有大小合適的盤區可以使用。