39

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

4

4 回答 4

50

这个问题有点老了,但我还是决定回答它,因为我一直在做一些研究。我的回答是基于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扩展名。请参阅下面的屏幕截图。

示例 MySQL 数据库表截图

.frm表格文件存储表格的格式。详细信息:MySQL .frm 文件格式

.ibd文件存储表的数据。详细信息:InnoDB File-Per-Table 表空间

就是这样的人!我希望我帮助了某人。

于 2018-01-07T10:57:45.487 回答
24

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

一些 DBMS 将整个数据库存储在一个文件中,一些拆分表、索引和其他对象类型以分隔文件,一些拆分文件不是按对象类型而是按一些存储/大小标准,有些甚至可以完全绕过文件系统等...

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

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

首先,DBMses 不仅仅与性能有关:

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

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

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

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


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

2通过隔离事务,甚至允许客户端显式锁定数据库的特定部分。

于 2012-04-30T11:03:38.773 回答
5

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

希望有帮助。

于 2012-04-30T05:11:24.977 回答
3

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

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

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

于 2013-05-29T22:39:27.700 回答