展开

关键词

第26期:索引设计(索引下推)

在不使用 ICP 索引扫描的过程: MySQL 存储引擎层只把满足索引键值对应的整行表一条一条取出,并且上传给 MySQL 服务层。 使用 ICP 扫描的过程: MySQL 存储引擎层,先根据过滤条件中包含的索引键确定索引区间,再在这个区间的上使用包含索引键的其他过滤条件进行过滤,之后规避掉不满足的索引,只根据满足条件的索引回表取回数据上传到 返回数据这一块虚线表示规避掉的,开启 ICP 很明显减少了上传到 MySQL 存储引擎层、MySQL 服务层的条数,节省了 IO。 ICP 仅用于需要访问基表所有时使用,适用的访问方法为:range、ref、eq_ref、ref_or_null。 我上面举的例子即是 ref 类型,ICP 尤其是对联合索引的部分列模糊查找非常有效。 2. ICP 同样适用于分区表。 3. ICP 的目标是减少全行读取,从而减少 I/O 操作,仅用于二级索引。

30330

神奇的 SQL 之 ICP → 索引条件下推

我们往下看   回表     通过某个索引无法直接完成 SQL 查询(where 条件的列和 select 的列不全部存在于任何一个索引中),那么此时需要获取完整的数据来完成此次查询,从索引项到获取对应的完整数据的过程就叫回表 MyISAM 的回表过程指的是根据叶子节点中的数据的地址来获取完整的过程,无论是聚簇索引还是二级索引都可能存在回表的过程;MyISAM 的回表与 InnoDB 还是有差别的   无论是 InnoDB (InnoDB和MyISAM)的索引层面进行过滤,减少了回表与返回 MySQL Server 层的交互开销,提高了 SQL 的执行效率   ICP 优化过程     假设我们有表: tbl_icp 没有使用 ICP 时,引擎层会将满足 Index Key 范围限制的所有数据(示例中一共 6 条)逐条返回给 Server 层,然后由 server 层应用 Index Filter 和 Table I/O,而 InnoDB 的聚簇索引的叶子节点存放的就是完整的数据,只要索引数据被读到内存了,那么索引项对应的完整数据也就读到内存了,那么通过索引项获取数据的过程就在内存中进行了,无需进行磁盘

70720
  • 广告
    关闭

    什么是世界上最好的编程语言?丨云托管征文活动

    代金券、腾讯视频VIP、QQ音乐VIP、QB、公仔等奖励等你来拿!

  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    MySQL性能优化特性 Index Condition Pushdown

    c 关闭ICP ? 当开启ICP时 查询在sending data环节时间消耗是 0.000189s ? 当关闭ICP时 查询在sending data环节时间消耗是 0.000735s ? ICP 开启时的执行计划 含有 Using index condition 标示 ,表示优化器使用了ICP对数据访问进行优化。 ? ICP 关闭时的执行计划显示use where. ? 该过程不回表,只访问符合条件的1条并返回给MySQL Server ,有效的减少了io访问和各层之间的交互。 ICP 关闭时 ,仅仅使用索引作为访问数据的方式。 ? ICP只能用于二级索引,不能用于主索引。 并非全部where条件都可以用ICP筛选。 如果where条件的字段不在索引列中,还是要读取整表的到server端做where过滤。 ICP的加速效果取决于在存储引擎内通过ICP筛选掉的数据的比例。 5.6 版本的不支持分表的ICP 功能,5.7 版本的开始支持。 当sql 使用覆盖索引时,不支持ICP优化方法。 ?

    28530

    五分钟搞懂MySQL索引下推

    我们来具体看一下,在没有使用ICP的情况下,MySQL的查询: 存储引擎读取索引; 根据索引中的主键值,定位并读取完整的行; 存储引擎把交给Server层去检测该是否满足WHERE条件。 使用ICP的情况下,查询过程: 存储引擎读取索引(不是完整的行); 判断WHERE条件部分能否用索引中的列来做检查,条件不满足,则处理下一行索引; 条件满足,使用索引中的主键去定位并读取完整的行 (就是所谓的回表); 存储引擎把交给Server层,Server层检测该是否满足WHERE条件的其余部分。 没有使用ICP 在MySQL 5.6之前,存储引擎根据通过联合索引找到name likelike '张%' 的主键id(1、4),逐一进行回表扫描,去聚簇索引找到完整的行,server层再对数据根据 MySQL索引下推(ICP)简单理解及例子 [4]. 一文读懂什么是MySQL索引下推(ICP

    30430

    男朋友连模糊匹配like %%怎么优化都不知道

    索引条件下推ICP ICP介绍 MySQL 5.6开始支持ICP(Index Condition Pushdown),不支持ICP之前,当进行索引查询时,首先根据索引来查找数据,然后再根据where条件来过滤 特性的情况下,走的是复合索引idx_name_nickname,Extra=Using Where,首先通过复合索引 idx_name_nickname 前缀从存储引擎中读出 name = 'Lyn' 的所有 开启ICP特性后,由于 nickname 的 like 条件可以通过索引筛选,存储引擎层通过索引与 where 条件的比较来去除不符合条件的,这个过程不需要读取,同时只返回给Server层筛选后的 删除全文索引的表的数据时,会导致辅助索引表大量delete操作,InnoDB内部采用标删除,将已删除的DOC_ID都特殊的FTS_*_DELETED表中,但索引的大小不会减少,需要通过设置参数innodb_optimize_fulltext_only IN BOOLEAN MODE:布尔模式,表是字符串前后的字符有特殊含义,如查找包含SK,但不包含Lyn的,可以用+,-符号。

    90410

    MySQL中Explain的Extra字段值Using index和Using where;Using index和Using where以及Using index condition的区别

    Using index condition是MySQL 5.6中引入的一种新特性,叫做Index Condition Pushdown(ICP),是一种在存储引擎层使用索引过滤数据的一种优化方式。 使用ICP可以减少存储引擎层返回需要被index filter过滤掉的行,省去了存储引擎访问基表的次数以及MySQL服务器访问存储引擎的次数。 Using index condition仅适用于二级索引,原因是ICP的目的是减少全行读取的次数,从而减少IO操作。 而对于innodb聚集索引,完整的已被读入到innodb缓冲区,在这种情况下,ICP不会减少io,所以ICP只适用于二级索引,一般发生在查询字段无法被二级索引覆盖的场景,该场景下往往需要回表。 通过ICP,可以减少存储引擎返回的行,从而减少了IO操作。

    21240

    一起做激光SLAM:ICP匹配用于闭环检测

    同时,将帧的序号,如果有比当前帧的序号少200以上的历史帧(比如8的中心位置,会遇到历史帧),就最近的历史帧(KD树输出按距离从近到远排序),历史帧用在后面闭环检测。 laserCloudMap_Ind[pointSearchInd[i]-1]; map_point_end = laserCloudMap_Ind[pointSearchInd[i]]; //从起始点取到结束点 闭环检测 ICP基础学习 我在gitee里的test_icp里有三个程序,有对应的数据,使用得改路径。 icp原理可以看: https://blog.csdn.net/u010696366/article/details/8941938 一个简单的ICP写法如下,align时启动icp迭代,并将矫正输出cloud_fina1 基本可以确定点的数量增加会对icp有好处,使用一帧全部点和大量历史帧进行ICP效果优于只使用plane点,地面点对于匹配有很大作用,可能有着地面点的cloud点会更有充分的结构信息,便于ICP

    9720

    事件相机特征跟踪-模板跟踪方法

    首先对传统图形进行边缘提取,得到边缘图,之后利用”Good features to track”中的方法提取一定数量、响应强度大于一定阈值的关键点,然后保留关键点附近的边缘图作为特征模板,每个特征模板包含的数据即:一组了坐标的二维数据点 数据模板不仅要事件发生的位置,还有发生的坐标,因为当区域内产生新的事件时需要删掉时间戳最老旧的事件,从而实现数据模板的更新。 3.3 两个模板匹配 两个模板的匹配采用ICP算法,在实行ICP时,考虑到事件相机数据有可能存在噪声,所以论文设定了一个2像素阈值,当距离大于2像素时认为是外点。 当ICP迭代收敛后,检测外点数量,如果较少则认为跟踪成功,返回ICP获得的变化。文章采用2维旋转与2维平移描述运动参数。 ? (ICP迭代示意图,红色为特征模板,蓝色圈为数据模板,黄色为离群点;当产生绿框所示的一个事件后,ICP结束后红色的特征模板会发生轻微变化,这个变化就是运动参数) 3.4 数据模板更新 当两个模板完成匹配

    24620

    squid命中率分析参数注释

    ================= 3.0直接看这里 基本的使用方法 *取得squid运行状态信息: squidclient -p 80 mgr:info //注意这里80要是你对应的端口号 根目下 squid 本身提供一只 cgi 程式,档名为cachemgr.cgi,squid 安装完后将它复制到 Apache 下的 cgi-bin 这个目下即可使用。 messages received: 0 接受到的icp query数量 Number of ICP messages sent: 0 发出icp query数量 Number of queued 82.0%, 60min: 90.5% Storage Swap size: 7723212 KB 存放cache的磁碟使用量 Storage Mem size: 7992 KB 存放cache的忆体使用量 KB Total in use: 33183 KB 82% Total free: 7392 KB 18% Total size: 40576 KB Memory accounted for: 忆体使用状态

    30330

    【索引潜规则】-覆盖索引、ICP、MRR详解

    启用ICP后,可以在索引遍历过程中,由存储引擎对索引中包含的字段先做判断,直接过滤掉不满足条件的,减少了回表的次数。ICP可以减少回表的次数,同时也能减少server层与引擎层交互的次数。 开启ICP策略后,引擎在遍历索引的过程中就会对name字段进行判断,直接过滤掉不满足 name like '%ck' 条件的,然后再去获取行ICP优化策略虽然好,但是受限于以下条件(根据官方文档整理): ICP用于range、ref、eq_ref和ref_or_null等访问方式且需要访问数据行时。 ICP可以用于Innodb和MyISAM引擎表,包括两种引擎的分区表。 对于Innodb引擎表,ICP只适用于二级索引。ICP的主要目的就是减少回表的次数,从而减少I/O操作。 但是对于Innodb引擎的聚簇索引,完整的数据行已经被读入到innodb bufferpool中,在这种情况下使用ICP并不能减少I/O操作。 在条件引用子查询时无法使用ICP

    56610

    逸轩二级域名分发系统域名使用方法以及介绍

    如有发现直接删除and账号。 请合理使用 申请使用的话,这个就不教程了蛮简单的注册个账号然后就能申请,默认是只能申请三个的。解析支持别名和A。 域名 | 赞助者 | 备案信息 | | :------------: | :------------: | :------------: | | www.wi9.pw |杨逸轩ღ | 沪ICP 备16006836号-5 | | www.334ka.top |太萌了 | 未备案 | | www.dyysy.cn | 承诺 | 冀ICP备17026740号-1 | | www.dogdad.cn |59大佬 | 冀ICP备16023298号-12 | 特别需要注意 申请的时候填写邮箱请填写正确的。

    3.3K70

    萌国ICP备案「杂

    起源(还是找来的) 自从某萌主(娜娜)买了 gov.moe 域名以后 心便大了 开始在网络上兴风作浪 前不多久 瑾忆童鞋 在百忙中抽空写了个ICP系统 然后大家看到的萌国ICP备案查询系统就上线了 萌国 ICP备案 嗯,你没看错,这是萌国的ICP备案。 我们说的是萌国ICP备案,简称 萌ICP备 萌ICP备非真实中国ICP备案 仅供萌友网站互动,请放心食用。 号码请先查询是否已占用 https://icp.gov.moe 申请通过后,邮箱收萌备案号 例如 萌ICP备 20211118号,并按提示在页脚加上萌ICP备的链接,以便查询对接系统。 后言 什么时候我也能嫖一个 gov.xx 的域名,我能飞天 我的号 萌ICP备 20211118号 最底下也有233

    26110

    MySQL 索引条件下推 Index Condition Pushdown

    MySQL 索引条件下推 Index Condition Pushdown 出现在MySQL5.6及之后的版本中,能大幅提升查询效率,原因如下: 内容摘自《深入理解MariaDB和MySQL》 下面使实验 first_name 这个前面%匹配导致无法用到整个idx_lastname_firstname 索引的,只能根据last_name 字段过滤部分数据,然后在里面找出符合first_name列 %sal的行 但是,如果开启ICP,则执行计划如下: > set optimizer_switch='index_condition_pushdown=on'; > explain extended select * 而数据表的比较first_name条件是在MySQL引擎层进行的。 开启ICP之后,包含在索引中的数据列条件(即上述SQL中的first_name LIKE %sal') 都会一起被传递给InnoDB存储引擎,这样最大限度的过滤掉无关的行。 执行计划如下图: ?

    57931

    MySQL——通过EXPLAIN分析SQL的执行计划

    4.type=ref,使用非唯一索引或唯一索引的前缀扫描,返回匹配某个单独值的行 store_id字段存在普通索引(非唯一索引) EXPLAIN SELECT*FROM customer WHERE 表关联查询时必定会有一张表进行全表扫描,此表一定是几张表中行数最少的表,然后再通过非唯一索引寻找其他关联表中的匹配行,以此达到表关联时扫描行数最少。 ? 因为customer、payment两表中customer表的行数最少,所以customer表进行全表扫描,payment表通过非唯一索引寻找匹配行。 5.type=eq_ref,类似ref,区别在于使用的索引是唯一索引,对于每个索引键值,表中只有一条匹配 eq_ref一般出现在多表连接时使用primary key或者unique index作为关联条件 ,然后根据复合索引idxrentaldate回表获取,最终根据条件 customer_id>=300AND customer_id<=400过滤出最后的查询结果(在服务层完成)。

    36620

    MySQL——通过EXPLAIN分析SQL的执行计划

    EXPLAIN SELECT * FROM customer WHERE create_date>='2006-02-13' ; type=ref,使用非唯一索引或唯一索引的前缀扫描,返回匹配某个单独值的行 表关联查询时必定会有一张表进行全表扫描,此表一定是几张表中行数最少的表,然后再通过非唯一索引寻找其他关联表中的匹配行,以此达到表关联时扫描行数最少。 因为customer、payment两表中customer表的行数最少,所以customer表进行全表扫描,payment表通过非唯一索引寻找匹配行。 payment ON customer.customer_id = payment.customer_id; type=eq_ref,类似ref,区别在于使用的索引是唯一索引,对于每个索引键值,表中只有一条匹配 ,然后根据复合索引idx_rental_date回表获取,最终根据条件customer_id>=300 AND customer_id<=400过滤出最后的查询结果(在服务层完成)。

    22440

    相关产品

    • 增值电信

      增值电信

      增值电信(Telecom value-added,TVA)为您提供免费的增值电信许可证办理咨询业务,专业顾问全程贴身服务,复杂材料撰写,申请进度实时通知,标准服务流程,最快1天递交申请材料。

    相关资讯

    热门标签

    扫码关注云+社区

    领取腾讯云代金券