代码之家  ›  专栏  ›  技术社区  ›  Pierreten

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

  •  16
  • Pierreten  · 技术社区  · 16 年前

    我一直对如何在数据库中抛出一些SQL感兴趣,它几乎瞬间以有序的方式返回结果,而不将其视为黑盒以外的任何东西。

    到底怎么回事?

    我很确定它与值在内存中的排列方式有关,类似于数组;但除此之外,我不知道还有多少其他的。

    如何以一种方便所有这些的方式解析SQL?

    4 回复  |  直到 7 年前
        1
  •  12
  •   Quassnoi    16 年前

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

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

    几乎每个引擎都让您看到它将为某个查询构建什么查询计划。

    • MySQL PostgreSQL ,在查询前加上 EXPLAIN

    • SQL Server 你跑 SET SHOWPLAN_TEXT ON 在运行查询之前或只需按 Ctrl-L 在管理工作室

    • Oracle ,在查询前使用 EXPLAIN PLAN FOR 然后发布 SELECT * FROM (dbms_xplan.display)

    你可能会在我的博客中发现有趣的这篇文章:

    解决了同样的问题。

        2
  •  5
  •   Aiden Bell    16 年前

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

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

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

    真的,RDBMS包含了来自计算机科学的各种结构…每种方法都有高度发展和专门化的方法,可以将SQL的隐含语义转换为具体的存储。

    想想MySQL和Oracle有多不同…或者PostgreSQL和Microsoft SQL。他们都 尝试 为了满足一些常见的类似SQL的规范…但是如何实现这个规范是多种多样的。

    引擎结合了各种各样的异域、专业索引来查找数据的物理位置、缓存系统等等。

    大量开放源码 数据库,如 MySQL , PostgreSQL 和搜索系统,如 Sphinx 您可以查看它们的实现。开放源码是为了学习任何东西!试着找一个“导师”来指导你通过这个来源。

        3
  •  3
  •   Roman    16 年前

    我很确定它与值在内存中的排列方式有关,类似于数组;但除此之外,我不知道还有多少其他的。

    您可能还想查找有关 B+ Trees . 这就是主要关系数据库使用的数据结构。

        4
  •  2
  •   Jaroslav Moravec    16 年前

    你可以读这些书:

    [1]H.Garcia Molina,《数据库系统实现》,普伦蒂斯霍尔出版社,2000年。

    [2]R.Elmasri,S.B.Navath,数据库系统基础,本杰明/卡明斯出版社。公司,1994年