数据(通常是关于数据库)实际驻留在计算机中的哪个位置?

时间:2018-01-26 07:05:27

标签: mysql database neo4j relational-database

我的问题可能非常无知。请多多包涵。我只是一名大学毕业生,想要了解数据库如何像故事一样运行。

我想知道数据库在哪里存储数据?

数据以哪种格式存储在硬盘中? (我的意思是,像Mongo一样存储像BSON这样的数据(JSON的二进制格式,包含很多类型信息和关于巨大字符串中值的元数据)。同样,关系数据库存储数据是否有任何特定格式在硬盘上?)

假设我在MySQL中完成了插入查询,处理器将如何完成此任务?
我期待像你这样的回答 1.阅读说明(您知道要插入哪些信息以及插入的位置) 2.需要插入的数据写在Cache中 3.通过指定需要插入的内存地址,将需要插入的Cache中的内存写入(使用内存总线和写入头发送)到SSD。

数据插入是否符合聚集索引?

每次插入后群集索引是否会更新?

使用SELECT查询时,表中的所有数据是否都会被带到ram然后运行WHERE,GROUP BY,HAVING等命令?

与关系数据库不同,像Neo4J这样的图形数据库如何运行查询? (我的意思是,要运行单个查询,它会将整个节点图表带到RAM中吗?)

1 个答案:

答案 0 :(得分:0)

您的SSD或HDD是块存储设备。数据以blocks(字节序列)读取和写入,其中包含关系的记录。块具有最大长度,块大小,通常为8k。

数据库表和索引可以以多种形式之一存储在磁盘上。最常用的形式是B +树和ISAM。

数据库管理系统(DBMS)是允许您与数据库交互的软件。

其最重要的功能是:

  • 交易管理员
  • 查询处理器
  • 存储管理器

在实际评估之前对查询进行预处理,您猜对了,查询处理器负责这一点。您的查询由 DML编译器编译(例如INSERT,UPDATE,DELETE,SELECT)或由 DDL Interpreter 解释(例如CREATE,ALTER,DROP)。

对于要评估的查询,必须将其转换为低级执行计划(可在文件系统的物理级别使用的表达式)。对于关系数据库:物理relational algebra

query-plan

扫描程序标记查询,解析器检查语法并验证关系,属性,数据类型等。

实际评估查询需要

翻译到关系代数中。代数允许符号计算,这对于查询优化很重要。

查询优化程序将原始查询计划重写为更有效的评估计划。

query-optimizer

查询优化确定关系代数运算符的特定顺序。可以使用几种不同算法之一来评估每个单一关系代数运算符。所选计划将被注释并移交给评估引擎。

优化启发式算法是魔法"魔法的一部分。在数据库核心内。这是一笔十亿美元的业务。

一些操作:

选择运算符评估原语(例如WHERE,不要与SELECT混淆!):

  • 关系扫描(关系 R 的线性/二进制搜索)
    • 从磁盘上的db文件中获取包含记录 R
    • 的块
    • 扫描每条记录并检索所有符合条件的行
    • 订购 R 时,我们可以进行二元搜索
  • 索引查找
    • 关系 R
    • 的索引扫描
    • 注意:索引通常大于它们索引的表,因此不在主内存中!
  • 关系扫描与比较
    • 线性扫描/二进制搜索
  • 复杂的选择(和,或,而不是)
    • 在某些情况下,根据索引的存在,可以使用上述算法的组合

排序(例如ORDER BY):

  • 如果关系适合主内存,我们可以快速排序,例如
  • 如果只能将某些关系块提取到DB缓冲区中,则需要进行外部排序。最经常使用合并排序。

投影(例如SELECT):

  • 一般需要完整的关系扫描

加入(例如equi-join):

  • 嵌套循环连接
    • 简单但效率很低。从未在实践中使用过。
  • 阻止嵌套循环连接
    • 通过预取多个记录来减少块读取开销
  • 索引嵌套循环连接
    • 使用内循环索引来避免扫描
  • 合并加入
    • 仅可用于等连接和自然连接
    • 如果两个关系都已排序,效率非常高
  • 哈希加入
    • 仅可用于等连接和自然连接
    • 通过join属性哈希每个元组并比较
    • 当哈希表完全保存在内存中时,成本非常低

对于每个运营商,使用评估基元注释合适的评估计划,可以执行

这只是当然的简要概述。有关更多信息,我建议您阅读Ramez Elmasri撰写的数据库系统基础知识以及有关该主题的其他材料。

<强>参考