关于数据库:MySQL如何存储数据

How does MySQL store data

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


这个问题有点陈旧但我决定回答它,因为我一直在做一些挖掘。我的答案是基于linux文件系统。基本上mySQL将数据存储在硬盘中的文件中。它将文件存储在具有系统变量"datadir"的特定目录中。打开mysql控制台并运行以下命令将告诉您文件夹的确切位置。

1
2
3
4
5
6
7
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

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

sample MySQL database table screenshot

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

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

伙计就是这样!我希望我能帮助别人。


Does it store the data in one big file?

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

我不知道MySQL使用了哪些策略(可能取决于你是否使用MyISAM与InnoDB等),但幸运的是,无所谓:从客户端的角度来看,这是客户端的DBMS实现细节应该很少担心。

What methods does it use to make data access quicker them just reading and writing to a regular file?

首先,DBMses不只是关于性能:

  • 它们更关注数据的安全性 - 它们必须确保即使在断电或网络故障时也不会出现数据损坏。
  • DBMS也是关于并发性的 - 它们必须在多个客户端之间进行仲裁,访问并可能修改相同的数据

至于您的具体性能问题,关系数据非常容易受到索引和聚类的影响,DBMS可以充分利用它来实现性能。最重要的是,SQL的基于集合的特性使DBMS能够选择检索数据的最佳方式(理论上至少,某些DBMS比其他DBMS更好)。有关DBMS性能的更多信息,我热烈推荐:使用The Index,Luke!

此外,您可能已经注意到大多数DBMS都是旧产品。就像几十年前一样,这在我们行业的条件下确实很有用。这样做的一个结果是人们有足够的时间来优化DBMS代码库。

从理论上讲,你可以通过文件实现所有这些功能,但我怀疑你最终会看到一些看起来非常接近DBMS的东西(即使你有时间和资源来实际完成它)。那么,为什么重新发明轮子(除非你不想把轮子放在第一位;))?

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

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


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

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

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


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

希望有所帮助。