【问题标题】:How does MySQL store dataMySQL如何存储数据
【发布时间】:2012-05-09 20:35:42
【问题描述】:

我环顾了谷歌,但没有找到任何好的答案。它是否将数据存储在一个大文件中?它使用什么方法来使数据访问比读取和写入常规文件更快?

【问题讨论】:

  • 您可能想了解它使用的不同数据库引擎。有些确实将数据存储在“大文件”中,而另一些则存储在内存中。对于访问速度,它使用固定大小的列和行,因此获取特定记录比扫描所有文本更容易。它还可以保留数据索引以使检索更快。默认和最常用的引擎是我的 isam。其他包括 inno-db 和 MEMORY。
  • @Greg 但即使是内存表也存储在某处以确保持久性。底线是它存储在磁盘上的某个位置。
  • @Namphibian 内存表中的数据不是持久化的,只有结构是
  • @Cez 那么数据结构不是持久化的吗?不知何故,数据或元数据都位于磁盘上。您可以将临时表的数据存储在文件中,然后在启动期间将数据加载到 mem 表中。

标签: mysql database database-design


【解决方案1】:

从技术上讲,一切都是“文件”,包括文件夹。您的整个硬盘驱动器都是巨大的文件。话虽如此,是的关系数据库,MySQL 将存储数据包含在硬盘上的数据文件中。数据库和写入/读取文件之间的区别是苹果和橘子。数据库提供了一种结构化的方式来存储和搜索/检索数据,这种方式你永远无法通过读取和写入文件来复制。当然,除非你编写了自己的数据库。

希望有帮助。

【讨论】:

    【解决方案2】:

    它是否将数据存储在一个大文件中?

    一些 DBMS 将整个数据库存储在一个文件中,一些拆分表、索引和其他对象类型到单独的文件中,一些拆分文件不是按对象类型而是按一些存储/大小标准,有些甚至可以entirely bypass the file system 等等等……

    我不知道 MySQL 使用哪种策略(可能取决于您使用的是 MyISAM 还是 InnoDB 等),但幸运的是,这并不重要:从客户端的角度来看,这是一个 DBMS 实现客户应该很少担心的细节。

    它使用什么方法来使数据访问更快,他们只需读取和写入常规文件?

    首先,DBM 不仅仅关乎性能:

    • 他们更关注数据的安全 - 他们必须确保即使在断电或网络故障的情况下也不会损坏数据。1
    • DBMS 还涉及并发性 - 它们必须在访问和可能修改相同数据的多个客户端之间进行仲裁。2

    至于您的具体性能问题,关系数据对索引和集群非常“敏感”,DBMS 充分利用它来实现性能。最重要的是,SQL 的基于集合的特性让 DBMS 可以选择检索数据的最佳方式(至少在理论上,一些 DBMS 在这方面比其他的更好)。更多关于 DBMS 性能的信息,我强烈推荐:Use The Index, Luke!

    另外,您可能注意到大多数 DBMS 都是相当老的产品。就像 几十年 一样,这在我们行业的术语中确实是亿万年。这样做的一个结果是人们有足够的时间来优化 DBMS 代码库。

    理论上,您可以通过文件来实现所有这些事情,但我怀疑您最终会得到一些看起来非常接近 DBMS 的东西(即使您有时间和资源来实际做到这一点)。那么,为什么要重新发明轮子(除非你一开始就不想要轮子;))?


    1 通常通过某种“日志”或“事务日志”机制。此外,为了最大限度地减少“逻辑”损坏(由于应用程序错误)的可能性并促进代码重用,大多数 DBMS 支持声明性约束(域、键和引用)、触发器和存储过程。

    2isolating transactions 甚至允许客户端显式锁定数据库的特定部分。

    【讨论】:

      【解决方案3】:

      当您将数据存储在平面文件中时,顺序读取是紧凑且高效的,但没有快速的方法来随机访问它。对于可变长度数据(例如文档、名称或字符串)尤其如此。为了允许快速随机访问,大多数数据库使用称为 B-Tree 的数据结构将信息存储在单个文件中。这种结构允许快速插入、删除和搜索,但它可以使用比原始文件多 50% 的空间。但是,通常这不是问题,因为磁盘空间既便宜又大,而主要任务通常需要快速访问。 了解更多信息: http://en.wikipedia.org/wiki/B-tree

      仔细查看 MySQL 文档,我们发现索引可以选择设置为“BTREE”或“HASH”类型。在单个 MySQL 文件中,存储了多个索引,可以使用任一数据结构。

      虽然安全性和并发性很重要,但这些并不是数据库存在的原因,而是附加功能。第一个数据库存在,因为不可能随机访问包含可变长度数据的顺序文件。

      【讨论】:

      • 实际上,第一个数据库的存在是为了促进应用程序之间的数据共享,这些应用程序通常由不同的编程团队编写和支持。
      【解决方案4】:

      这个问题有点老了,但我还是决定回答它,因为我一直在研究这个问题。我的回答是基于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”目录的截图。

      目录中的每个文件夹代表一个 MySQL 数据库。每个数据库文件夹都包含代表该数据库中表的文件。每个表有两个文件,一个扩展名为.frm,另一个扩展名为.idb。请看下面的截图。

      .frm 表格文件存储表格的格式。详情:MySQL .frm File Format

      .ibd 文件存储表的数据。详情:InnoDB File-Per-Table Tablespaces

      就是这样,伙计们!我希望我能帮助到某人。

      【讨论】:

      • 如果有办法对这些文件进行源代码控制就好了
      • @user4757074 您可以使用git init 将任何目录转换为本地 Git 存储库……但您为什么要对这些文件进行源代码控制?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-22
      • 2014-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多