本文翻译自Coding-Geek文章:《 How does a relational database work》。原文链接:http://coding-geek.com/how-databases-work/#Buffer-Replacement_strategies

本文翻译了如下章节, 介绍数据库查询优化器的数据访问方式:

Access Path–数据访问方法

在执行联表操作之前先要获取数据。现在讲一下获取数据有哪些方式。

Note:由于所有获取数据方式的关键都是磁盘I/O,所以我不会在这讨论时间复杂度的问题。

Full scan–全表扫描

如果你曾经阅读过介绍SQL执行方案的文档,你一定已知道full scan这个概念。

full scan是数据库将整张表的数据或者索引读取到内存。从磁盘I/O消耗来说,

全表数据扫描的成本明显比全表索引扫描要高很多。

Range Scan –区段扫描

还有其它的一些扫描方式,如:索引区段扫描。它用在数值范围做查询条件的时候(例如:WHERE AGE > 20 AND AGE <40)。当然,你必须得为AGE字段建立了索引才能使用索引区段扫描。

我们已在第一章讲了,区间查询的时间复杂度是log(N) +M,其中N是建立索引的数据条数,M是区间内的数据条数。M和N的值已经在数据特征统计时计算出来了(Note:M是条件断言AGE >20 AND AGE<40的可选元素)。对于区段扫描你甚者不需要读取全部的索引数据,因此它的磁盘I/O成本比全表数据扫描小得多。

Unique scan–唯一值扫描

当你仅需要查询指定索引的单条记录,你可以使用唯一值扫描。

Access by row id–根据行ID获取(数据)

大多数情况,如果数据库建立了索引,它将查询与索引关联的行记录,它将使用行ID去获取数据。

例如下面的SQL语句:


如果你已对person表的age字段建了索引,优化器将使用索引找到所有age是28(的行ID),然后从表中查询出对应的行数据记录。索引仅包含了age信息,你需要的是lastname和firstname,这些需要从原表中去拿。

但是,如果你执行下面的SQL:

SELECT TYPE_PERSON.CATEGORY from PERSON ,TYPE_PERSON
WHERE PERSON.AGE = TYPE_PERSON.AGE

PERSON表的索引将用于与TYPE_PERSON表做关联,但不会用row id去查询数据,因为不需要查PERSON表中的其它信息。

在需要查询少量数据的时候没什么问题。关键的瓶颈在磁盘I/O,如果你需要根据row id查询太多数据,数据库可能会使用全表数据扫描(代替)。

Others paths–其它方法

我并未介绍所有的数据获取方式。你想了解更多可以阅读oracle官方文档。

上面讲的获取方式名称,在不同的数据库中可能有不同的叫法,但是背后的含义是一致的。

关系型数据库工作原理-查询优化器之数据访问方式(翻译自Coding-Geek文章)的更多相关文章

  1. 关系型数据库工作原理-查询优化器之索引(翻译自Coding-Geek文章)

    本文翻译自Coding-Geek文章:< How does a relational database work>.原文链接:http://coding-geek.com/how-data ...

  2. 关系型数据库工作原理-查询优化器(翻译自Coding-Geek文章)

    本文翻译自Coding-Geek文章:< How does a relational database work>.原文链接:http://coding-geek.com/how-data ...

  3. 关系型数据库工作原理-归并排序(翻译自Coding-Geek文章)

    本文翻译自Coding-Geek文章:< How does a relational database work>. 原文链接:http://coding-geek.com/how-dat ...

  4. 关系型数据库工作原理-时间复杂度(翻译自Coding-Geek文章)

    本文翻译自Coding-Geek文章:< How does a relational database work>. 原文链接:http://coding-geek.com/how-dat ...

  5. 关系型数据库工作原理-事务管理(一)(翻译自Coding-Geek文章)

    本文翻译自Coding-Geek文章:< How does a relational database work>. 原文链接:http://coding-geek.com/how-dat ...

  6. 关系型数据库工作原理-高速缓存(翻译自Coding-Geek文章)

    本文翻译自Coding-Geek文章:< How does a relational database work>. 原文链接:http://coding-geek.com/how-dat ...

  7. 关系型数据库工作原理-事务管理(二)(翻译自Coding-Geek文章)

    本文翻译自Coding-Geek文章:< How does a relational database work>. 原文链接:http://coding-geek.com/how-dat ...

  8. 关系型数据库工作原理-快速缓存(翻译自Coding-Geek文章)

    本文翻译自Coding-Geek文章:< How does a relational database work>. 原文链接:http://coding-geek.com/how-dat ...

  9. 关系型数据库工作原理-数据特征统计分析(翻译自Coding-Geek文章)

    本文翻译自Coding-Geek文章:< How does a relational database work>.原文链接:http://coding-geek.com/how-data ...

随机推荐

  1. Three.js 学习笔记(1)--坐标体系和旋转

    前言 JavaScript 3D library The aim of the project is to create an easy to use, lightweight, 3D library ...

  2. shiro框架的使用实例

    文档路径(包括数据库结构):https://pan.baidu.com/s/1eRP14AI

  3. Java8的一些新特性

    速度更快: 代码更少(增加了新的语法Lamdba表达式): Lamdba操作符"->" 语法格式: 左侧:参数列表 右侧:接口抽象方法的实现功能 Lamdba表达式 3.强大 ...

  4. HDU - 2102 A计划 (BFS) [kuangbin带你飞]专题二

    思路:接BFS判断能否在限制时间内到达公主的位置,注意如果骑士进入传送机就会被立即传送到另一层,不会能再向四周移动了,例如第一层的位置(x, y, 1)是传送机,第二层(x, y, 2)也是传送机,这 ...

  5. Codeforces475D - CGCDSSQ

    Portal Description 给出长度为\(n(n\leq10^5)\)的序列\(\{a_n\}\),给出\(q(q\leq3\times10^5)\)个\(x\),对于每个\(x\),求满足 ...

  6. homebrew 无法安装提示不能在根目录下使用

    首先提示一点:能谷歌绝对不要百度解决问题. 1.昨天百度了一天,都都没有找到解决方案.因为昨天是20161130日,我的蓝灯FQ软件的流量使用光了.悲催- 2.今天是20161201日,我可以免费使用 ...

  7. 集成电路883和883b有什么区别

    根据用途,元器件的质量等级可分为:用于元器件生产控制.选择和采购的质量等级和用于电子设备可靠性预计的质量等级两类,两者有所区别,又相互联系. 用于元器件生产控制.选择和采购的质量等级 元器件的质量等级 ...

  8. Windows Subsystem for Linux (WSL)挂载移动硬盘U盘

    WSL想通过移动硬盘处理一些数据,结果进去了无法发现移动硬盘,于是搜了好久也没有一个正确的解决办法,终于找到一个,现在贡献出来与大家共享. WSL比起linux挂载硬盘简单一些.而且windows本身 ...

  9. hi3531spi flash启动和bootrom启动的对比

    a

  10. Android常见Crash类型分析(一)

    问题1.   java.lang.IllegalStateException: The specified child already has a parent. You must call remo ...