SQL中的where条件,在数据库中提取与应用浅析

上传人:z**** 文档编号:122182445 上传时间:2022-07-20 格式:DOC 页数:6 大小:152.50KB
收藏 版权申诉 举报 下载
SQL中的where条件,在数据库中提取与应用浅析_第1页
第1页 / 共6页
SQL中的where条件,在数据库中提取与应用浅析_第2页
第2页 / 共6页
SQL中的where条件,在数据库中提取与应用浅析_第3页
第3页 / 共6页
资源描述:

《SQL中的where条件,在数据库中提取与应用浅析》由会员分享,可在线阅读,更多相关《SQL中的where条件,在数据库中提取与应用浅析(6页珍藏版)》请在装配图网上搜索。

1、SQL 中的 where 条件,在数据库中提取与应用浅 析发布时间:2013 年 6 月 2 日 发布者: OurMySQL来源: 问题描述 阅读:452次消灭0评论一条SQL,在数据库中是如何执行的呢?相信很多人都会对这个问题比较感兴趣。 当然,要完整描述一条SQL在数据库中的生命周期,这是一个非常巨大的问题,涵 盖了 SQL的词法解析、语法解析、权限检查、查询优化、SQL执行等一系列的步骤, 简短的篇幅是绝对无能为力的。因此,本文挑选了其中的部分内容,也是我一直都 想写的一个内容,做重点介绍:给定一条SQL如何提取其中的where条件? where条件中的每个子条件,在 SQL执行的过程中

2、有分别起着什么样的作用?通过本文的介绍,希望读者能够更好地理解查询条件对于SQL语句的影响;撰写出 更为优质的SQL语句;更好地理解一些术语,例如:MySQL 5.6中一个重要的优化 Index Condition Pushdown,究竟 push down 了什么? 本文接下来的内容,安排如下:1. 简单介绍关系型数据库中数据的组织形式;2. 给定一条SQL,如何提取其中的where条件;3. 最后做一个小的总结;2关系型数据库中的数据组织关系型数据库中,数据组织涉及到两个最基本的结构:表与索引。表中存储的是完 整记录,一般有两种组织形式:堆表(所有的记录无序存储),或者是聚簇索引表(所 有

3、的记录,按照记录主键进行排序存储)。索引中存储的是完整记录的一个子集,用 于加速记录的查询速度,索引的组织形式,一般均为B+树结构。有了这些基本知识之后,接下来让我们创建一张测试表,为表新增几个索引,然后 插入几条记录,最后看看表的完整数据组织、存储结构式怎么样的。(注意:下面的 实例,使用的表的结构为堆表形式,这也是0racle/DB2/PostgreSQL等数据库采用 的表组织形式,而不是InnoDB引擎所采用的聚簇索引表。其实,表结构采用何种 形式并不重要,最重要的是理解下面章节的核心,在任何表结构中均适用) create table t1 (a int primary key, b i

4、nt, c int, d int, e varchar(2o);create index idx_t1_bcd on t1(b, c, d);insert into ti values (4,3,1,1,d);insert into ti values (1,1,1,1,a);insert into ti values (8,8,8,8, h):insert into ti values (2,2,2,2,b);insert into ti values (5,2,3,5,e);insert into ti values (3,3,2,2,c);insert into ti values (7

5、,4,5,5,g);insert into t1 values (6,6,4,4,f);ti表的存储结构如下图所示(只画出了 idx_ti_bcd索引与ti表结构,没有包括ti 表的主键索引):表TI: (a int primary key, b int, c int3 d int, e varchar(20)create index idx_tl_bcd on tl(b, c, d);索JI: idx 11 bed38181812231231125134682548254841825376318瘀23461182325411825254dahbecgf堆表简单分析一下上图,idx_ti_bc

6、d索引上有b,c,d三个字段(注意:若是InnoDB类的 聚簇索引表,idx_t1_bcd上还会包括主键a字段),不包括a,e字段。idx_t1_bcd索引,首先按照b字段排序,b字段相同,则按照c字段排序,以此类推。记录在索引中按照3SQL,的序“here条件提取任何字段排序。在有了以上的t1表之后,接下来就可以在此表上进行SQL查询了,获取自己想要 的数据。例如,考虑以下的一条SQL:select * from ti where b = 2 and b 1 and d != 4 and e != a;一条比较简单的SQL,一目了然就可以发现where条件使用到了 b,c,d间四个字段, 而

7、ti表的idx_ti_bcd索引,恰好使用了b,c,d这三个字段,那么走idx_ti_bcd索 引进行条件过滤,应该是一个不错的选择。接下来,让我们抛弃数据库的思想,直 接思考这条SQL的几个关键性问题:l此SQL,覆盖索引idx_ti_bcd上的哪个范围?起始范围:记录2,2,2是第一个需要检查的索引项。索引起始查找范围由b = 2, C 1决定。终止范围:记录8,8,8 是第一个不需要检查的记录,而之前的记录均需要判断。索 引的终止查找范围由b 1的约束;(6,4,4)不满足 d != 4的约束。而c,d列,均可在索引idx_t1_bcd中过滤掉不满足条件的索引记 录的。因此,SQL中还可

8、以使用c 1 and d != 4条件进行索引记录的过滤。3在确定了索引中最终能够过滤掉的条件之后,还有哪些条件是索引无法过滤的? 此问题的答案显而易见,e != a这个查询条件,无法在索引idx_t1_bcd上进行过滤, 因为索引并未包含e列。e列只在堆表上存在,为了过滤此查询条件,必须将已经 满足索引查询条件的记录回表,取出表中的e列,然后使用e列的查询条件e != a 进行最终的过滤。在理解以上的问题解答的基础上,做一个抽象,可总结出一套放置于所有SQL语句 而皆准的where查询条件的提取规则:所有SQL的where条件,均可归纳为3大类:Index Key (First Key &

9、Last Key),Index Filter,Table Filter o接下来,让我们来详细分析者3大类分别是如何定义,以及如何提取的。l Index Key用于确定SQL查询在索引中的连续范围(起始范围+结束范围)的查询条件,被称之 为Index Key。由于一个范围,至少包含一个起始与一个终止,因此Index Key也 被拆分为Index First Key和Index Last Key,分别用于定位索引查找的起始,以及 索引查询的终止条件。Index First Key用于确定索引查询的起始范围。提取规则:从索引的第一个键值开始,检查其在 where条件中是否存在,若存在并且条件是=、

10、=,则将对应的条件加入Index First Key之中,继续读取索引的下一个键值,使用同样的提取规则;若存在并且条件是, 则将对应的条件加入Index First Key中,同时终止Index First Key的提取;若不存 在,同样终止Index First Key的提取。针对上面的SQL,应用这个提取规则,提取出来的Index First Key为(b = 2, c 1)。 由于c的条件为,提取结束,不包括d。Index Last KeyIndex Last Key的功能与Index First Key正好相反,用于确定索引查询的终止范围。 提取规则:从索引的第一个键值开始,检查其在w

11、here条件中是否存在,若存在并 且条件是=、=,则将对应条件加入到Index Last Key中,继续提取索引的下一个 键值,使用同样的提取规则;若存在并且条件是 ,则将条件加入到Index Last Key 中,同时终止提取;若不存在,同样终止Index Last Key的提取。针对上面的SQL,应用这个提取规则,提取出来的Index Last Key为(b 8),由于 是 符号,因此提取b之后结束。2 Index Filter在完成Index Key的提取之后,我们根据where条件固定了索引的查询范围,但是 此范围中的项,并不都是满足查询条件的项。在上面的SQL用例中,(3,1,1),

12、 (6,4,4) 均属于范围中,但是又均不满足SQL的查询条件。Index Filter的提取规则:同样从索引列的第一列开始,检查其在where条件中是 否存在:若存在并且where条件仅为=则跳过第一列继续检查索引下一列,下一 索引列采取与索引第一列同样的提取规则;若where条件为=、=其中 的几种,则跳过索引第一列,将其余where条件中索引相关列全部加入到Index Filter之中;若索引第一列的where条件包含=、=、=之外的条件,则 将此条件以及其余where条件中索引相关列全部加入到Index Filter之中;若第一 列不包含查询条件,则将所有索引相关条件均加入到Index

13、 Filter之中。针对上面的用例SQL,索引第一列只包含=、 两个条件,因此第一列可跳过, 将余下的c、d两列加入到Index Filter中。因此获得的Index Filter为c1 and d !=4。3 Table FilterTable Filter是最简单,最易懂,也是提取最为方便的。提取规则:所有不属于索引 列的查询条件,均归为Table Filter之中。同样,针对上面的用例SQL,Table Filter就为e != /a3.1 Index Key/Index Filter/Table Filter 小结SQL语句中的where条件,使用以上的提取规则,最终都会被提取到Ind

14、ex Key (First Key & Last Key), Index Filter 与 Table Filter 之中。Index First Key,只是用来定位索引的起始范围,因此只在索引第一次Search Path(沿着索引B+树的根节点一直遍历,到索引正确的叶节点位置)时使用,一次判 断即可;Index Last Key,用来定位索引的终止范围,因此对于起始范围之后读到的每一条索 引记录,均需要判断是否已经超过了 Index Last Key的范围,若超过,则当前查询 结束;Index Filter,用于过滤索引查询范围中不满足查询条件的记录,因此对于索引范围 中的每一条记录,均需

15、要与Index Filter进行对比,若不满足Index Filter则直接丢 弃,继续读取索引下一条记录;Table Filter,则是最后一道where条件的防线,用于过滤通过前面索引的层层考验 的记录,此时的记录已经满足了 Index First Key与Index Last Key构成的范围,并 且满足Index Filter的条件,回表读取了完整的记录,判断完整记录是否满足Table Filter中的查询条件,同样的,若不满足,跳过当前记录,继续读取索引的下一条 记录,若满足,则返回记录,此记录满足了 where的所有条件,可以返回给前端用 4结语在读完、理解了以上内容之后,详细大家

16、对于数据库如何提取where中的查询条件, 如何将where中的查询条件提取为Index Key,Index Filter,Table Filter有了深刻 的认识。以后在撰写SQL语句时,可以对照表的定义,尝试自己提取对应的where 条件,与最终的SQL执行计划对比,逐步强化自己的理解。同时,我们也可以回答文章开始提出的一个问题:MySQL 5.6中引入的IndexCondition Pushdown,究竟是将什么Push Down到索引层面进行过滤呢?对了, 答案是 Index Filter。在 MySQL 5.6 之前,并不区分 Index Filter 与 Table Filter,

17、 统统将Index First Key与Index Last Key范围内的索引记录,回表读取完整记录, 然后返回给MySQL Server层进行过滤。而在MySQL 5.6之后,Index Filter与Table Filter分离,Index Filter下降到InnoDB的索引层面进行过滤,减少了回表与返回 MySQL Server层的记录交互开销,提高了 SQL的执行效率。猜您喜欢2008年9月30日-MySQL优化之COUNT(*)效率2008年9月25日-验证使用子查询提高MySQL分页效率2008年9月25日-Mysql数据库索引查询优化的分享2008年9月23日-select语句where的作用栏目: MySQL 高级应用 标签: where 发布者: OurMySQL。 文章链接.

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!