关系数据库如何在引擎盖下工作?

时间:2010-05-21 23:01:09

标签: sql database parsing

我一直对你如何在数据库中抛出一些SQL感兴趣,它几乎立即以有序的方式返回你的结果,而不用把它当作黑盒子以外的任何东西。

真正发生了什么?

我很确定它与如何在内存中定期布局值有关,类似于数组;但除此之外,我不知道其他什么。

如何以一种方式解析SQL以促进所有这些?

4 个答案:

答案 0 :(得分:12)

引擎构建了一个这样的查询计划。

这是一组算法,用于返回您使用SQL查询逻辑描述的集合。

几乎每个引擎都可以让您查看为特定查询构建的查询计划。

  • MySQLPostgreSQL中,您在查询前加上EXPLAIN

  • 一词
  • SQL Server中,您在运行查询之前运行SET SHOWPLAN_TEXT ON,或者只需在Management Studio中按Ctrl-L

  • Oracle中,您使用EXPLAIN PLAN FOR添加查询,然后发出SELECT * FROM (dbms_xplan.display)

您可以在我的博客中找到有趣的文章:

解决了同样的问题。

答案 1 :(得分:5)

从基本的意义上讲,对于许多RDBMS:

a)语法分析阶段从服务器设置(套接字,无论如何)获取输入,并将此SQL转换为有效的AST或其他中间形式。
b)然后将此信息传递给存储引擎,该引擎将此查询描述转换为索引,表,分区,复制数据和构成存储模式语义的其他元素的一组查找。 c)然后引擎返回一组数据,然后以任何形式(XML,CSV,客户特定)提供给客户端。

但是没有一个真正的答案。您将在索引算法,分发算法,缓存,锁定等方面找到相似之处......但主要的相似之处在于SQL语言本身的语言接口。除此之外,它们可以以他们希望的任何方式实现...提供他们的结果满足输入查询的预期语义。

真正的RDBM包含来自计算机科学的各种结构......每个结构都有高度开发和专门的方法,用于将SQL的隐含语义转换为具体存储。

想想MySQL和Oracle有多么不同......或者PostgreSQL和Microsoft SQL。他们都尝试来满足某种类似SQL的通用规范......但是如何实现该规范是多种多样的。

引擎包含各种exotica,专业索引,以查找数据物理位置,缓存系统等。

吨的开源数据库,例如MySQLPostgreSQL和搜索系统(例如Sphinx),您可以查看其实施情况。开源是为了学习任何东西!尝试并找到一个“导师”来指导您完成源头。

答案 2 :(得分:3)

  

我很确定它与如何在内存中定期布局值有关,类似于数组;但除此之外,我不知道其他什么。

您可能还想在B+ Trees上查找文章。这是主要关系数据库使用的数据结构。

答案 3 :(得分:2)

你可以阅读这些书:

[1] H. Garcia-Molina,数据库系统实施,Prentice Hall,2000

[2] R. Elmasri,S。B. Navathe,数据库系统基础,Benjamin / Cummings Publ。 Comp。,Inc,1994