我一直对你如何在数据库中抛出一些SQL感兴趣,它几乎立即以有序的方式返回你的结果,而不用把它当作黑盒子以外的任何东西。
真正发生了什么?
我很确定它与如何在内存中定期布局值有关,类似于数组;但除此之外,我不知道其他什么。
如何以一种方式解析SQL以促进所有这些?
答案 0 :(得分:12)
引擎构建了一个这样的查询计划。
这是一组算法,用于返回您使用SQL
查询逻辑描述的集合。
几乎每个引擎都可以让您查看为特定查询构建的查询计划。
在MySQL
和PostgreSQL
中,您在查询前加上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,专业索引,以查找数据物理位置,缓存系统等。
有吨的开源数据库,例如MySQL,PostgreSQL和搜索系统(例如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