MySQL如何存储数据

时间:2012-04-30 04:59:14

标签: mysql database database-design

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

4 个答案:

答案 0 :(得分:18)

  

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

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

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

  

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

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

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

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

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

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


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

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

答案 1 :(得分:18)

这个问题有点陈旧但我决定回答它,因为我一直在做一些挖掘。我的答案是基于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 screenshot

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

sample MySQL database table screenshot

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

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

那是伙计们!我希望我能帮助别人。

答案 2 :(得分:3)

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

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

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

答案 3 :(得分:2)

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

希望有所帮助。