2012-04-30 110 views
18

我環顧了谷歌,但沒有找到任何好的答案。它是否將數據存儲在一個大文件中?它使用什麼方法使數據訪問更快地讓他們讀取和寫入常規文件?MySQL如何存儲數據

+2

你可能想看看它使用的不同數據庫引擎。有些會將數據存儲在「大文件」中,而其他數據則存儲在內存中。對於訪問速度,它使用固定大小的列和行,因此獲取特定記錄比掃描所有文本更容易。它還可以保持數據索引,使檢索速度更快。默認和最常用的引擎是我的isam。其他包括inno-db和MEMORY。 – gcochard

+0

@Greg,但即使是內存表也存儲在某處以確保持久性。底線是它存儲在磁盤的某個地方。 – Namphibian

+0

@Namphibian內存表中的數據是不是持久化的,只有結構是 – Cez

回答

15

它是否將數據存儲在一個大文件中?

一些的DBMS整個數據庫存儲在一個文件中,一些分解表,索引和其他對象種到單獨的文件,一些拆分的對象文件不厚道,而是由一些存儲/尺寸標準,甚至,有的就entirely bypass the file system,等等......

我不知道MySQL使用的這些策略中的哪一個(它可能取決於您使用MyISAM還是InnoDB等),但幸運的是,這並不重要:從客戶端角度來看,這是客戶應該很少擔心的DBMS實現細節。

它使用什麼方法,使數據存取更快他們只是讀取和寫入一個普通文件?

首先的DBMS不只是性能:

  • 他們更數據的約安全 - 他們必須確保沒有數據損壞甚至在一個臉停電或網絡故障。
  • DBMS也是約併發 - 他們必須在多個客戶端之間進行仲裁併可能修改相同的數據。

至於你的業績的具體問題,關係數據是非常「敏感」到索引和聚類,這是得天獨厚的的DBMS利用來實現性能。最重要的是,SQL的基於集合的性質讓DBMS選擇檢索數據的最佳方式(至少在理論上,有些是的DBMS在那個比別人更好)。欲瞭解更多有關DBMS的表現,我熱烈推薦:Use The Index, Luke!

此外,您可能會注意到,大多數的DBMS是相當老產品。像十年舊的,這對我們行業來說確實是一個永恆的話題。其中一個結果就是人們有足夠的時間來優化DBMS代碼庫。在理論上,你可以通過文件實現所有這些事情,但是我懷疑你最終會看到與DBMS非常接近的東西(即使你有足夠的時間和資源來實現它)。那麼,爲什麼要重新發明輪子(除非你不想要輪子?))?


通常儘管某種 「日誌」 或 「事務日誌」 機制。此外,爲了最小化「邏輯」損壞(由於應用程序錯誤)並促進代碼重用的可能性,大多數DBMS支持聲明性約束(域,鍵和引用),觸發器和存儲過程。

通過isolating transactions甚至通過允許客戶端明確地鎖定數據庫的特定部分。

1

從技術上講,一切都是一個「文件」,包括文件夾..你的整個硬盤是巨大的文件。話雖如此,是關係型數據庫,MySQL將存儲數據包含在硬盤上的數據文件中。數據庫和寫入/讀取文件之間的區別是蘋果和橘子。數據庫提供了一種結構化的方式來存儲和搜索/檢索數據的方式,你永遠不會通過只讀和寫入文件複製..除非你寫你自己的db當然..

希望有所幫助。

3

當您將數據存儲在平面文件中時,它是緊湊有效的,可以按順序讀取,但沒有快速的方式隨機訪問它。對於諸如文檔,名稱或字符串的可變長度數據尤其如此。爲了實現快速隨機訪問,大多數數據庫使用稱爲B-Tree的數據結構將信息存儲在單個文件中。這種結構允許插入,刪除和搜索速度很快,但它可以比原始文件多佔用多達50%的空間。然而,通常這不是問題,因爲磁盤空間便宜且更大,而主要任務通常需要快速訪問。 欲瞭解更多信息: http://en.wikipedia.org/wiki/B-tree

仔細觀看了MySQL的文檔,我們發現指數也可以任意設定爲「BTREE」或「HASH」型。在單個MySQL文件中,存儲了可以使用任何數據結構的多個索引。

雖然安全性和併發性很重要,但這些不是爲什麼數據庫存在,而是增加了功能。第一個數據庫存在,因爲不可能隨機訪問包含可變長度數據的順序文件。

3

這個問題有點老,但我決定回答它,因爲我一直在做一些相同的挖掘。我的答案是基於Linux文件系統。基本上,mySQL將數據存儲在硬盤中的文件中。它將文件存儲在具有系統變量「datadir」的特定目錄中。打開一個mysql控制檯並運行以下命令將會告訴你該文件夾的確切位置。

mysql> SHOW VARIABLES LIKE 'datadir'; +---------------+-----------------+ | Variable_name | Value | +---------------+-----------------+ | datadir | /var/lib/mysql/ | +---------------+-----------------+ 1 row in set (0.01 sec)

,你可以從上面的命令看,我的 「DATADIR」 定位於/var/lib/mysql/。 「datadir」的位置在不同的系統中可能會有所不同。該目錄包含文件夾和一些配置文件。每個文件夾代表一個mysql數據庫,幷包含具有該特定數據庫數據的文件。以下是我的系統中「datadir」目錄的屏幕截圖。

sample "datadir" directory screnshot

目錄中的每個文件夾代表一個MySQL數據庫。每個數據庫文件夾都包含表示該數據庫中的表的文件。每個表格有兩個文件,一個文件的擴展名爲.frm,另一個文件的擴展名爲.idb。見下面的截圖。

sample mysql database table screenshot

.frm表文件存儲表的格式。請點擊此處查看詳細信息MySQL .frm File Format

.ibd文件存儲表的數據。點擊這裏查看詳細信息InnoDB File-Per-Table Tablespaces

多數民衆贊成!我希望我能幫助別人。