本文翻译自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. ucore文件系统详解

    最近一直在mooc上学习清华大学的操作系统课程,也算是复习下基本概念和原理,为接下来的找工作做准备. 每次深入底层源码都让我深感操作系统实现的琐碎,即使像ucore这样简单的kernel也让我烦躁不已 ...

  2. 深入java虚拟机学习 -- 类的加载机制

    当看到"类的加载机制",肯定很多人都在想我平时也不接触啊,工作中无非就是写代码,不会了可以百度,至于类,jvm是怎么加载的我一点也不需要关心.在我刚开始工作的时候也觉得这些底层的内 ...

  3. OSI网络模型

    OSI中的层 功能 TCP/IP协议族 应用层         文件传输,电子邮件,文件服务,虚拟终端 TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet 表示层         数 ...

  4. Docker MariaDB 10.3 Galera Cluster 集群同步复制 多主 Docker Haproxy 负载均衡

    mariadb 现有动态列,支持json格式存储,类似mongodb的bson,但是操作能力较为尴尬,中间件有spider,我非常感兴趣的一个东西 关于spider 这里有一篇很好的博文,有时间一定得 ...

  5. chmod 与大写 X

    chmod(1) 手册页中对权限位的描述中提及到 rwxXst 六个权限标记, rwx 是几乎所有 Linux 初学者都会学到的,更进者会了解到 st 两个标记,但 X 却少有提起.所以笔者大致了解了 ...

  6. mac 系统安装 eclipse 方法

    经过好几天的折腾,终于在各种不靠谱的经验.说明的忽悠中把自己心爱的 mac 安装上了 eclipse,看到别人的不靠谱,我决定自己写一篇经验,为了大家能够不走我这么多的弯路,也为了自己将来可以回来看看 ...

  7. redis 突然大量逐出导致读写请求block

    现象 redis作为缓存场景使用,内存耗尽时,突然出现大量的逐出,在这个逐出的过程中阻塞正常的读写请求,导致 redis 短时间不可用: 背景 redis 中的LRU是如何实现的? 当mem_used ...

  8. 【Unity3D】Unity3D开发《我的世界》之二、创建一个立方体

    转载请注明出处:http://www.cnblogs.com/shamoyuu/p/unity_minecraft_02.html 这一篇的内容比较简单,因为所有理论内容都在上一篇中讲到了.但有两点需 ...

  9. NLP+语篇分析(五)︱中文语篇分析研究现状(CIPS2016)

    摘录自:CIPS2016 中文信息处理报告<第三章 语篇分析研究进展.现状及趋势>P21 CIPS2016 中文信息处理报告下载链接:http://cips-upload.bj.bcebo ...

  10. VxWorks:添加自己组件到Tornado

    项目要求将cpci的驱动做成Tornado组件,尝试了一下! Folder FOLDER_CPCI {                    //上层组件设置  NAME  cpci componen ...