作家
登录

如何快速预估索引性能及查询效率

作者: 来源: 2018-01-03 08:58:36 阅读 我要评论

【限时免费】岁尾最强一次云计算大年夜会,看传统、社区、互联网企业若何碰撞?


在《DB——数据的攫取和存储方法》中,我们介绍了影响数据攫取的方法,随机IO温柔序IO,在《Sql优化器毕竟帮你做了哪些工作?》介绍了影响萌芽的一些根本身分,个中介绍了过滤因子、索引片的宽窄与大年夜小以及匹配列和过滤列 是若何应用在sql萌芽中的。在《什么是三星索引》介绍了索引设计须要重要的身分以及推荐的设计方法。

那么这篇,我们将综合应用这些常识,并经由过程两个办法,快速估算当前的索引的机能,以及萌芽的效力。大年夜这篇文┞仿你会获得以下常识:BQ—根本问题法QUBE—快速上限估算法

一、根本问题法—BQ

根本问题法,这个办法想必会用数据库的人,都邑知道,简单来讲,就是当前select 是否用到了索引,不过BQ方法会加倍详尽。

评估的方法:

table:

现有的索引或者筹划中的索引是否包含了 WHERE 中应用的全部列,也就是当前萌芽,是否有一个索引是半宽索引(匹配where后所有谓词列)? 如不雅没有,那么竽暌功该将缺氨赡谓词列加到现有索引上。

不过对于BQ并不克不及包缠足够的机能。比如如下:

那么竽暌剐没有更周全的评估方法?下面的QUBE,就是一种更周全快速的评估方法。

二、快速估算上限法——QUBE

QUBE比BQ更耗时,但它能揭示所有与索引或者表设计相干的机能问题。QUBE会对每个谓词所用的过滤因子都异常接近于实际的最差情况,如斯固然会比较消极,但不会像BQ那样漏掉削发明的某些问题。

QUBE的目标在于在开辟时代就能将拜访路径迟缓的问题裸露出来,这个估算办法的输出就是本地响应时光(Local Response Time),简称为LRT。

我们先大年夜概懂得一下LRT的时光构成。在一个惯例的多用户情况中,法度榜样的并发会导致对所需资本的各类竞争,是以不得不列队来获取这些资本。那么QUBE会忽视磁盘驱动列队以外的其他所有类型的列队,已供给一个简单的评估过程。

在清除以上身分之后,我们获得的一个是一个异常简单的估算过程,仅须要以下变量来处理即可。

最终的QUBE公式为:

我们把随机拜访一次的时光定义为10ms,以及把次序攫取一次的时光定义为0.01ms,这个在《DB——数据的攫取和存储方法》有介绍,不懂得的可以以前看一下。

三、示例

我们假设表test有1000w的数据,同时又如下两个索引,一个是结合主键,一个是帮助索引:

结合主键:PRIMARY KEY (id,user_name,sex)

帮助索引:KEY name_sex_age (user_name,sex,age)

1、示例1—帮助索引拜访

我们可以在索引中增长匹配字段(user_name,sex,age,c_date) ,如斯就可以直接索引表拜访,不再进行回表拜访。我们可以看到 此时的索引是一个三星索引。如斯可以节俭100000ms,只剩下1020ms阁下。

  1. select user_name,sex,age,c_date from test where user_name=’test1’ and sex=1 

匹配列user_name sex

匹配索引name_sex_age (user_name,sex,age),

过滤因子:

个中sex 有2个不合的值,过滤因子为50%(1/2)

组合过滤因子=0.2% * 50% =0.1%结不雅集=1000w * 0.2% * 50% =10000

LRT估算:

LRT=TR * 10ms + TS * 0.01ms + F * 0.1ms

上述中where后面的谓词都包含在索引(name,sex,age),但这个萌芽倒是一个全索引或者全表扫描,三星一一个都不占领。具体原因,可以查看《Sql优化器毕竟帮你做了哪些工作?》中的介绍。

1)、拜访索引表

该萌芽匹配到了索引name_sex_age (user_name,sex,age),过滤因子是0.1%,其须要扫描索引表数据,是10000行,这个中包含1次随机萌芽(第一次定位page)和9999次次序萌芽。

索引LRT:

TR =1 * 10ms=10ms

TS=9999 * 0.01ms=100ms

index_LRT=10ms+100ms=110ms

2)、拜访主表

基于前面介绍的常识,我们可以知道,半宽索引可以确保回表拜访只产生在所有萌芽前提都知足的时刻。也就是说,前提过滤会在表扫描之前产生,而不是之后产生。固然不克不及避免主表的随机拜访,但起码可以支撑索引表的次序攫取。

个中user_name 有500个不合的值,过滤因子为0.2%(1/500)

因为该索引name_sex_age (user_name,sex,age)是一个帮助索引,而字段’c_date’ 并不在索引中,是以须要一次主表扫描。而此索引不是聚簇索引,所以回表萌芽,须要10000次的随机IO萌芽。

表LRT:


  推荐阅读

  教你用 Python 来玩微信跳一跳

MacOS/Win,请应用如下操作开辟新的虚拟情况(不强调表示MacOS/Win雷同操作) 下载Anaconda. MacOS:默认安装/Win:留意安装时刻勾选设备路径或者之背工动设备,直至cmd后conda关键字有效 查看所有的虚拟情况 con>>>详细阅读


本文标题:如何快速预估索引性能及查询效率

地址:http://www.17bianji.com/lsqh/40192.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)