《DBNotes:single_table访问方法、MRR多范围读取优化、索引合并》

目录

  • single_table访问方法
    • const
    • ref
    • ref_or_null
    • range
    • index
    • all
  • MRR多范围读取优化
  • 索引合并
    • intersection
    • union
    • sort-union

single_table访问方法

const

在主键列或者unique二级索引与一个常数进行等值比较时才有效。
如果主键或者unique二级索引的索引列由多个列构成,则只有在索引列中的每个列都与常数进行等值比较时,才是const访问

ref

搜索条件为二级索引(非unique)与常数进行等值比较,形成的扫描区间为单点扫描区间(即【‘abc’,‘abc’】),采用二级索引来执行查询的访问方法为ref。注意采用二级索引执行查询时,每获取到一条二级索引记录就会进行一次回表操作。
TIPS:

  • 二级索引列允许存储NULL值时不限制NULL值的数量,所以执行key is NULL查询时最优只能执行ref操作
  • 索引列中包含多个列的二级索引时,只要最左边连续的列是与常数进行等值比较,就可以使用ref访问。

ref_or_null

当想找出某个二级索引列的值等于某个常数的记录,并且将该列中值为NULL的记录也找出来:

select * from single_table where key1 = 'abc' or key1 is null;

若使用二级索引,此时的扫描区间为:[‘abc’,‘abc’] 以及[NULL,NULL]。
这种访问方法即为ref_or_null。

range

select * from single_table where key2 IN (1438,6328) OR (key2 >= 38 AND key2 <= 79);

使用二级索引,扫描区间为[1438,1438] 、[6328,6328]、[38,79],改扫描区间为若干个单点扫描区间或者范围扫描区间。访问方法为range。当然(-无穷,+无穷)不为range访问方法。

index

key_part1,key_part2,key_part3 为二级索引,它们三个构成了一个联合索引,并且key_table2并不是联合索引的最左列。

select key_part1,key_part2,key_part3 from single_table where key_table2 = 'abc'; 

此时无法形成合适的范围区间来减少扫描的记录数量。
需要注意此时的查询符合两个条件:

  • 查询列表中key_part1,key_part2,key_part3,都包含在联合索引中
  • 搜索条件只有key_part2,这个列也包含在联合索引中
    很显然,需要扫描全部的联合索引,扫描区间为[-无穷,+无穷]。由于二级索引记录只有存放索引列和主键,也不需要回表,所以此时扫描去不的二级索引记录比直接扫描全部的聚集索引记录成本要小。这种方法称为index访问。

又如:

select * from single_table order by id;

通过全表扫描对表进行查询时有order by。此时也是使用index方法。

all

全表扫描,直接扫描全部的聚集索引记录。

MRR多范围读取优化

select * from single_table where key1 = 'abc' and key2 > 1000; 

该语句的执行步骤:
1、通过key1的索引定位扫描区间[‘abc’,‘abc’];
2、根据上面得到的主键值回表,得到完整用户记录,然后检测记录是否满足key2 > 1000的条件,满足则返回
3、重复2步骤,直到不满足key1 = ‘abc’
每次从二级索引中读取到一条记录后,就会根据该记录的主键值执行回表操作。
而某个扫描区间中的二级索引记录的主键值是无序的,每次回表都会随机读取一个聚集索引页面,带来的IO开销较大。
MRR会先读取一部分二级索引记录,将它们的主键值排序后再同意执行回表操作,节省IO开销。

索引合并

intersection

使用多个索引完成一次查询的执行方法称为索引合并

select * from single_table where key1 = 'a' and key3 = 'b';

可以先搜key1的索引,然后回表,根据key3条件筛选。
也可以先搜key1的索引,然后回表,根据key1条件筛选。
当然可以同时使用key1和key2的索引。在key1索引中扫描key1值得到区间[‘a’,‘a’],在key3索引中扫描key3值得到区间[‘b’,‘b’];
然后从两者操作结果中找到id列值相同的记录。然后根据共有的id值执行回表,这样可能会省下回表操作带来的开销。
当然需要注意的是要求从不同二级索引中获取到的二级索引记录都按照主键值排好序:

  • 从两个有序集合中取交集比两个从无序集合中取交集要容易
  • 如果获取到的id值有序排列,则在根据这些id值执行回表操作时不再是进行单纯的随机IO,就会提高效率。

如果从扫描区间中获得的记录并不是按照主键值排序的,那么就不能使用intersection索引合并。

union

select * from single_table where key1 = 'a' or key3 = 'b';

同时使用key1和key2的索引。在key1索引中扫描key1值得到区间[‘a’,‘a’],在key3索引中扫描key3值得到区间[‘b’,‘b’];
然后对两个结果进行去重,对去重后的id值进行回表操作。
同样二级索引记录都是要按照主键值排序,如果从扫描区间中获得的记录并不是按照主键值排序的,那么就不能使用union索引合并。

sort-union

union索引合并条件苛刻,下面的查询就不能使用union索引合并

select * from single_table where key1 < 'a' or key3 > 'z';

我们可以这样操作;
1、根据key1<'a’条件从key1的二级索引中获取记录,并将获取到的记录的主键值排序
2、根据key3<'z’条件从key3的二级索引中获取记录,并将获取到的记录的主键值排序
3、按照union操作两个记录合并
sort-union 索引合并比union索引合并多了一步对二级索引记录的主键值进行排序。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/377076.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

怎样通过命令管理Windows7桌面防火墙

&#xff08;1&#xff09;启用桌面防火墙netsh advfirewall set allprofiles state on&#xff08;2&#xff09;设置默认输入和输出策略netsh advfirewall set allprofiles firewallpolicy allowinbound,allowoutbound以上是设置为允许&#xff0c;如果设置为拒绝使用blockin…

ruby推送示例_Ruby for循环示例

ruby推送示例for循环 (The for loop) In programming, for loop is a kind of iteration statement which allows the block to be iterated repeatedly as long as the specified condition is not met or a specific number of times that the programmer knows beforehand. …

《DBNotes: Buffer Pool对于缓冲页的链表式管理》

目录Buffer Pool回顾Buffer Pool内部组成freelistflushlistLRU链表管理以及改进Buffer Pool回顾 我们知道针对数据库的增删改删操作都是在Buffer Pool中完成的&#xff0c;一条sql的执行步骤可以认为是这样的&#xff1a; 1、innodb存储引擎首先在缓冲池中查询有没有对应的数据…

一个延时调用问题

如果用下面第1行的写法&#xff0c;调用 [NSObject cancelPreviousPerformRequestsWithTarget:self selector:selector(removeFromSuperview) object:nil]; 可以生效 如果用下面第3行的写法&#xff0c;调用 [NSObject cancelPreviousPerformRequestsWithTarget:self selector:…

onclicklistener 方法使用汇总

相信很多像我一样的新手学习ANDROID开发会遇到这个问题&#xff0c;通过这几天的归类和总结&#xff0c;将我的理解写在下面&#xff0c;欢迎大家一起前来讨论&#xff1a; 以按钮BUTTON的监听事件为例&#xff0c;以下的监听实现都是等价的&#xff1a; 1.使用接口继承按钮监听…

《源码分析转载收藏向—数据库内核月报》

月报原地址&#xff1a; 数据库内核月报 现在记录一下&#xff0c;我可能需要参考的几篇文章吧&#xff0c;不然以后还得找&#xff1a; MySQL 代码阅读 MYSQL开源软件源码阅读小技巧 MySQL 源码分析 聚合函数&#xff08;Aggregate Function&#xff09;的实现过程 MySQL …

vim中的jk为什么是上下_JK的完整形式是什么?

vim中的jk为什么是上下JK&#xff1a;开玩笑 (JK: Just Kidding) JK is an abbreviation of "Just Kidding". JK是“ Just Kidding”的缩写 。 It is an expression, which is commonly used in messaging or chatting on social media networking sites like Faceb…

百度归来的学长做报告

今天下午下课到现在才总算闲下来&#xff0c;本来计划这个时间应该是读英语&#xff0c;做英语模拟题的时间&#xff0c;但是&#xff0c;我不得不写点什么来记录下刚才的事——在百度实习并且签下工作的学长做报告。 原本认为每个人的成功&#xff08;请允许我目前的眼光签个好…

转:Google论文之三----MapReduce

文章来自于&#xff1a;http://www.cnblogs.com/geekma/p/3139823.html MapReduce&#xff1a;大型集群上的简单数据处理 摘要 MapReduce是一个设计模型&#xff0c;也是一个处理和产生海量数据的一个相关实现。用户指定一个用于处理一个键值&#xff08;key-value&#xff09;…

合约 cd 模式_CD的完整形式是什么?

合约 cd 模式CD&#xff1a;光盘 (CD: Compact Disc) CD is an abbreviation of "Compact Disc". CD是“ Compact Disc”的缩写 。 It is a digital optical disc originally developed to store the audio of recordings in the format of a data file used as a p…

《DBNotes:Join算法的前世今生》

目录NestLoopJoin算法Simple Nested-Loop JoinIndex Nested-Loop JoinBlock Nested-Loop JoinBatched Key AccessHash Join算法In-Memory Join(CHJ)On-Disk Hash Join参考链接在8.0.18之前&#xff0c;MySQL只支持NestLoopJoin算法&#xff0c;最简单的就是Simple NestLoop Joi…

如何解决迅雷插件导致IE10崩溃的问题

Windows 8里面带的IE10酷不酷&#xff1f;沉浸式界面果然不同凡响&#xff0c;IE10让人几乎认不出来了&#xff01;这是微软的浏览器么&#xff1f;上面这张图是Windows8下Metro UI的新界面IE10&#xff0c;不过当我们切换回传统桌面的时候&#xff0c;也有IE10的经典版的。好吧…

UNITY3D与iOS交互解决方案

原地址&#xff1a;http://bbs.18183.com/thread-456979-1-1.html 本帖最后由 啊,将进酒 于 2014-2-27 11:17 编辑 “授人以鱼&#xff0c;不如授人以渔”&#xff0c;以UNITY3D调用iOS版的91SDK为例&#xff0c;利用C# / C / OBJ-C交互原理,本文将详细介绍UNITY3D与iOS之间交互…

c:if equal_C ++中的std :: equal()

c:if equalequal()作为STL函数 (equal() as a STL function) Syntax: 句法&#xff1a; bool equal(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2);Where, 哪里&#xff0c; InputIterator1 first iterator to start of the first sequence range I…

《DBNotes:Buffer Pool刷脏页细节以及改进》

本笔记知识沿用之前DBNotes: Buffer Pool对于缓冲页的链表式管理的部分知识 目录获取一个空闲页的源码逻辑Page_Cleaner_ThreadLRU_Manager_ThreadHazard Pointer作为驱逐算法改进参考获取一个空闲页的源码逻辑 任何一个读写请求都需要从Buffer pool来获取所需页面。如果需要的…

WordPress删除数据中标题重复文章的方法

一种是删除重复的方法是&#xff1a;使用插件,大家可以去官网上下载 二种删除重复的方法是&#xff1a;登录数据库&#xff0c;使用sql语句删除&#xff0c;具体的语句为如下代码&#xff1a; CREATE TABLE my_tmp AS SELECT MIN(ID) AS col1 FROM wp_posts GROUP BY post_titl…

hibernate配置

hibernate.cfg.xml <?xml version"1.0" encoding"UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC"-//Hibernate/Hibernate Configuration DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd&quo…

html中表单元素_HTML中的表单元素

html中表单元素1)<input>元素 (1) The <input> Element) The <input> element is used to get input from the user in an HTML form. <input>元素用于以HTML形式从用户获取输入。 <input> tag is used to get input using input element, the …

《搜索算法——DFS、BFS、回溯》

目录深搜200. 岛屿数量695. 岛屿的最大面积130. 被围绕的区域547. 省份数量417. 太平洋大西洋水流问题回溯广搜111. 二叉树的最小深度752. 打开转盘锁深搜与广搜结合934. 最短的桥深搜 深搜DFS&#xff0c;在搜索到一个新节点时&#xff0c;立即对该新节点进行遍历&#xff0c…

AP in R

AP聚类算法是目前十分火的一种聚类算法&#xff0c;它解决了传统的聚类算法的很多问题。不仅简单&#xff0c;而且聚类效果还不错。这里&#xff0c;把前两天学习的AP算法在R语言上面的模拟&#xff0c;将个人笔记拿出来与大家分享一下&#xff0c;不谈AP算法的原理&#xff0c…