MySQL 参考文档:SQL 语句优化(SELECT 语句优化)之索引条件下推(索引下推)优化

这篇具有很好参考价值的文章主要介绍了MySQL 参考文档:SQL 语句优化(SELECT 语句优化)之索引条件下推(索引下推)优化。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

索引下推优化官方文档说明 (Section 8.2.1.5):https://dev.mysql.com/doc/refman/5.7/en/index-condition-pushdown-optimization.html

1. 什么是索引下推?

\qquad 索引条件下推 (Index Condition Pushdown,ICP) 是 MySQL 在使用索引从表中检索行时的一种优化方法。在没有 ICP 的情况下,存储引擎遍历索引以定位基表中的行,并将它们返回给 MySQL 服务器,由服务器对行进行 WHERE 条件的评估。在启用 ICP 的情况下,并且如果 WHERE 条件的某些部分可以仅使用索引列进行评估,则 MySQL 服务器将此部分 WHERE 条件下推给存储引擎。ICP 可以减少存储引擎访问基表的次数和 MySQL 服务器访问存储引擎的次数。

Index Condition Pushdown (ICP) is an optimization for the case where MySQL retrieves rows from a table using an index. Without ICP, the storage engine traverses the index to locate rows in the base table and returns them to the MySQL server which evaluates the WHERE condition for the rows. With ICP enabled, and if parts of the WHERE condition can be evaluated by using only columns from the index, the MySQL server pushes this part of the WHERE condition down to the storage engine. The storage engine then evaluates the pushed index condition by using the index entry and only if this is satisfied is the row read from the table. ICP can reduce the number of times the storage engine must access the base table and the number of times the MySQL server must access the storage engine.

2. 索引下推优化有什么约束条件?

\qquad 索引条件下推优化的适用性受以下条件的约束:

  • 当需要访问完整的表行时 (SELECT *) 时,ICP 被用于 range、ref、eq_ref 和 ref_or_null 访问方法。
  • ICP 可以用于 InnoDB 和 MyISAM 表,包括分区的 InnoDB 和 MyISAM 表。
  • 对于 InnoDB 表,ICP 仅用于二级索引,此时 ICP 的目标是减少完整行读取的次数,从而减少 I/O 操作;对于 InnoDB 聚簇索引,完整记录已经读入 InnoDB 缓冲区,在这种情况下使用 ICP 不会减少 I/O。
  • 创建在虚拟生成列的二级索引不支持 ICP (InnoDB 支持在虚拟生成列上创建二级索引)。
  • 涉及子查询的条件无法被下推。
  • 涉及存储函数的条件无法被下推 (存储引擎无法调用存储函数)。
  • 触发条件无法下推 (关于触发条件的信息,参见 8.2.2.3 节,“使用 EXISTS 策略优化子查询”)。

Applicability of the Index Condition Pushdown optimization is subject to these conditions:

  • ICP is used for the range, ref, eq_ref, and ref_or_null access methods when there is a need to access full table rows.
  • ICP can be used for InnoDB and MyISAM tables, including partitioned InnoDB and MyISAM tables.
  • For InnoDB tables, ICP is used only for secondary indexes. The goal of ICP is to reduce the number of full-row reads and thereby reduce I/O operations. For InnoDB clustered indexes, the complete record is already read into the InnoDB buffer. Using ICP in this case does not reduce I/O.
  • ICP is not supported with secondary indexes created on virtual generated columns. InnoDB supports secondary indexes on virtual generated columns.
  • Conditions that refer to subqueries cannot be pushed down.
  • Conditions that refer to stored functions cannot be pushed down. Storage engines cannot invoke stored functions.
  • Triggered conditions cannot be pushed down. (For information about triggered conditions, see Section 8.2.2.3, “Optimizing Subqueries with the EXISTS Strategy”.)

3. 索引下推优化如何工作?

\qquad 为了理解 (索引下推) 优化如何工作,首先考虑当 ICP 未使用时索引的扫描过程:

  • 获取下一行,首先通过读取索引元组,然后使用索引元组来定位并读取完整的表行 (根据索引元祖保存的主键回表)。
  • 对应用于该表的 WHERE 条件部分进行测试,根据测试结果接受或拒绝该行。

\qquad 使用 ICP,扫描流程则如下所示:

  • 获取下一行的索引元组 (但不获取完整的表行)。
  • 对应用于该表且仅使用索引列即可进行检验的 WHERE 条件部分进行测试,如果条件不满足,则继续下一行的索引元组。
  • 如果条件满足,则使用索引元组来定位并读取完整的表行 (回表,但是由于索引下推过滤了索引元祖故减少了回表的数量)。
  • 对适用于该表的剩余 WHERE 条件部分进行测试,根据测试结果接受或拒绝该行。

To understand how this optimization works, first consider how an index scan proceeds when Index Condition Pushdown is not used:

  • Get the next row, first by reading the index tuple, and then by using the index tuple to locate and read the full table row.
  • Test the part of the WHERE condition that applies to this table. Accept or reject the row based on the test result.

Using Index Condition Pushdown, the scan proceeds like this instead:

  • Get the next row’s index tuple (but not the full table row).
  • Test the part of the WHERE condition that applies to this table and can be checked using only index columns. If the condition is not satisfied, proceed to the index tuple for the next row.
  • If the condition is satisfied, use the index tuple to locate and read the full table row.
  • Test the remaining part of the WHERE condition that applies to this table. Accept or reject the row based on the test result.

4. 如何判断 SQL 是否会走索引下推优化?

\qquad 当使用索引条件下推时,EXPLAIN 的输出在 Extra 列会显示 “Using index condition”,它不显示 " Using index" 是因为当必须读取整个表行时 ICP 不适用。

EXPLAIN output shows Using index condition in the Extra column when Index Condition Pushdown is used. It does not show Using index because that does not apply when full table rows must be read.

\qquad 总之就是,explain + sql 的打印的表信息的 Extra 列显示 “Using index condition” 时,则使用了索引下推。

5. 索引下推的官方例子?

\qquad 假设某个表包含有关人员及其地址的信息,并且该表具有定义为 INDEX (zipcode, lastname, firstname) 的索引。如果我们知道一个人的邮政编码值但不确定姓氏,我们可以像这样搜索:

SELECT * FROM people
  WHERE zipcode='95054'
  AND lastname LIKE '%etrunia%'
  AND address LIKE '%Main Street%';

\qquad MySQL 可以使用索引扫描 zipcode=‘95054’ 的人,第二部分 (姓氏 LIKE ‘%etrunia%’) 不能用于限制必须扫描的行数,因此如果没有索引条件下推,此查询必须检索 zipcode=‘95054’ 的所有用户的全表行。
\qquad 使用索引条件下推,MySQL 在读取整个表行之前检查姓氏 LIKE ‘%etrunia%’ 部分,这样可以避免读取与邮政编码条件匹配但与姓氏条件不匹配的索引元组对应的整行。
\qquad 索引下推优化默认开启,它可以通过使用 optimizer_switch 系统变量设置 index_condition_pushdown 的标识控制 (是否启用):文章来源地址https://www.toymoban.com/news/detail-564381.html

SET optimizer_switch = 'index_condition_pushdown=off';
SET optimizer_switch = 'index_condition_pushdown=on';

到了这里,关于MySQL 参考文档:SQL 语句优化(SELECT 语句优化)之索引条件下推(索引下推)优化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Mysql 数据库DQL 数据查询语言 SELECT 基本查询、条件查询、聚合查询、分组查询、排序查询、分页查询——包含DQL所有查询语句。吐血分享。

    DQL:数据查询语言; 用来对表内的数据进行查找 。Database Query Language SQL语句分为:基本查询、条件查询、聚合查询、分组查询、排序查询、分页查询。  可以发现name字段就只剩下一个张三了;   条件: 条件查询—比较运算符 比较运算符 功能 大于 = 大于等于 小于 = 小于等

    2024年01月19日
    浏览(56)
  • [MySQL]SQL优化之sql语句优化

    🌈键盘敲烂,年薪30万🌈 目录 一、索引优化 回顾: 📕索引分类: 📕索引失效: 📕设计原则: 📕SQL性能分析 二、SQL优化 语句优化 📕 insert语句: 📕 主键优化: 📕 order by优化: 📕 group by优化: 📕 limit 优化 📕 count 优化 📕 update 优化  📕索引分类: 一般分类:主

    2024年02月04日
    浏览(42)
  • mysql添加索引的方法(Navicat可视化加索引和sql语句加索引)

    使用索引的场景: 阿里云日志里出现了慢sql  然后发现publish_works_id字段会经常用于一些关联,所以决定把这个字段加上索引,优化sql 可视化navicat操作字段加索引,选择字段所在的表,第一步:右键-设计表 第二步:点击索引  第三步:添加索引 下面是通过sql语句添加索引的方法: 1、普

    2024年02月05日
    浏览(34)
  • mysql高级三:sql性能优化+索引优化+慢查询日志

    内容介绍 单表索引失效案例 0 、思考题: 如果把 100 万数据插入 MYSQL ,如何提高插入效率 (1)关闭自动提交,只手动提交一次 (2)删除除主键索引外其他索引 (3)拼写mysql可以执行的长sql,批量插入数据 (4)使用java多线程 (5)使用框架,设置属性,实现批量插入 1、

    2024年02月12日
    浏览(72)
  • MSQL系列(六) Mysql实战-SQL语句优化

    Mysql实战-SQL语句优化 前面我们讲解了索引的存储结构,B+Tree的索引结构,以及索引最左侧匹配原则,Explain的用法,可以看到是否使用了索引,今天我们讲解一下SQL语句的优化及如何优化 1.表结构 新建表结构 user, user_info id 主键id列 id_card 身份证id user_name 用户姓名 age 年龄

    2024年02月07日
    浏览(49)
  • MySQL索引3——Explain关键字和索引优化(SQL提示、索引失效、索引使用规则)

    目录 Explain 索引性能分析 Id ——select的查询序列号 Select_type——select查询的类型 Table——表名称 Type——select的连接类型 Possible_key ——显示可能应用在这张表的索引 Key——实际用到的索引 Key_len——实际索引使用到的字节数 Ref    ——索引命中的列或常量 Rows——预

    2024年02月14日
    浏览(57)
  • 【MySQL】SQL索引失效的几种场景及优化

    MySQL中提高性能的一个最有效的方式是对数据表设计合理的索引。索引提供了高效访问数据的方法,并且加快查询的速度, 因此索引对查询的速度有着至关重要的影响。 使用索引可以快速地定位表中的某条记录,从而提高数据库查询的速度,提高数据库的性能。如果查询时没

    2024年02月13日
    浏览(40)
  • MySQL高级篇复盘笔记(一)【存储引擎、索引、SQL优化、视图、触发器、MySQL管理】

    ❤ 作者主页:欢迎来到我的技术博客😎 ❀ 个人介绍:大家好,本人热衷于 Java后端开发 ,欢迎来交流学习哦!( ̄▽ ̄)~* 🍊 如果文章对您有帮助,记得 关注 、 点赞 、 收藏 、 评论 ⭐️⭐️⭐️ 📣 您的支持将是我创作的动力,让我们一起加油进步吧!!!🎉🎉 连接层

    2024年02月06日
    浏览(78)
  • (SQL学习随笔3)SQL语法——SELECT语句

    FROM LIMIT与OFFSET ORDER BY 单值比较 = 等于 不等于 、 = 小于、小于等于 、 = 大于、大于等于 多条件组合 范围筛选 空值匹配 LIKE通配 主要有两种通配符—— \\\'%\\\' 与 \\\'_\\\' ,其中 \\\'%\\\' 代表任意多个字符, \\\'_\\\' 代表单个任意字符 条件分组 数据变换 文本处理 MySQL PostgreSQL 在PostgreS

    2023年04月27日
    浏览(41)
  • [SQL挖掘机] - SELECT语句

    当我们处理数据库时, 经常需要从表中获取特定的数据. 为了实现这个目的, 我们使用一种称为\\\"select\\\"的语句. 简单来说, select语句就像一个过滤器或者选择器, 帮助我们选择 (select) 想要的数据. 通过编写select语句并执行查询操作, 我们可以按照我们的需求从数据库中提取特定的数

    2024年02月15日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包