代码之家  ›  专栏  ›  技术社区  ›  Ken

MySQL如何在磁盘上存储行?[复制]

  •  11
  • Ken  · 技术社区  · 16 年前

    0 回复  |  直到 8 年前
        1
  •  22
  •   Branko Dimitrijevic    12 年前

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

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

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

    它使用什么方法使数据访问更快--只需读写一个常规文件?

    首先,DBMS不仅仅是关于性能的:

    • 他们更关心 他们必须确保即使在断电或网络故障的情况下也没有数据损坏。 1
    • 数据库管理系统也是关于 并发 -它们必须在多个访问和修改相同数据的客户机之间进行仲裁。 2

    Use The Index, Luke!

    另外,您可能注意到大多数dbms都是相当旧的产品。像 旧的,用我们这个行业的术语来说真的是千禧年。结果之一就是人们有足够的时间来优化DBMS代码库。

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


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

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

        2
  •  35
  •   Rory O'Kane Erce    7 年前

    这个问题有点老了,但我还是决定回答它,因为我一直在做一些挖掘。我的答案是基于linux文件系统。基本上mySQL将数据存储在硬盘中的文件中。它将文件存储在具有系统变量“datadir”的特定目录中。打开a 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 screenshot

    .frm 另一个是 .idb

    sample MySQL database table screenshot

    这个 表文件存储表的格式。细节: MySQL .frm File Format

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

    就这样,伙计们!我希望我帮助了别人。

        3
  •  3
  •   apesa    14 年前

    从技术上讲,一切都是一个“文件”,包括文件夹。。你的整个硬盘都是巨大的文件。说到这里,是的,关系数据库,MySQL在硬盘上的一个数据文件中包含了存储数据。数据库和写/读文件之间的区别是苹果和橘子。数据库提供了一种结构化的方式来存储和搜索/检索数据,这种方式永远不可能只通过读写文件来复制。。当然,除非你自己写数据库。。

    希望有帮助。

        4
  •  3
  •   Rama Hoetzlein    13 年前

    更多信息: http://en.wikipedia.org/wiki/B-tree

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

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