mysql(四)索引下推

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

mysql(四)索引下推,mysql,数据库,crud,mysql,数据库

目录

数据准备:

标准案列:

问题1:索引下推如何开启和关闭?(MySQL5.6以后的版本)

问题2:索引下推在哪些情况下无法使用?

2.1下推条件遇到子查询 

         2.2下推条件遇到函数

2.3非InnoDB表和MyISAM表

注意事项:

1、索引下推只能存在联合索引里

2、范围列可以用到索引,但是范围列后面的列无法用到索引

 3、不要使用SELECT * FROM

4、减少子查询、范围等查询、慎用函数。


索引下推(Using index condition)为什么要单独写、因为这边还涉及到了数据在索引中的存放方式和规则。

数据准备:

我们借用在mysql(三)的创建的数据、来继续演示。

建表脚本

CREATE TABLE user_info( 

  id INT NOT NULL  COMMENT '主键',  

  name  varchar(50) NOT NULL COMMENT '名称',
	
  en_name  varchar(50) NOT NULL COMMENT '英文名称',

  age  INT NOT NULL COMMENT '年龄',
	
  status INT NOT NULL COMMENT '0 草稿 1 上架 2 下架',
	
  description varchar(100) NOT NULL COMMENT '描述',

  PRIMARY KEY (`id`)

);

#创建组合索引
ALTER TABLE `user_info` ADD INDEX index_name_age_status (`name`,`age`,`status`);

造数据函数

CREATE DEFINER=`root`@`localhost` PROCEDURE `123`()
BEGIN
	#Routine body goes here...
		declare i int default 1;
    while(i<1000)do
        insert into user_info values(i,CONCAT("yzh",FLOOR(RAND() * 100)),CONCAT("YZH",FLOOR(RAND() * 100)),FLOOR(RAND() * 100),1,FLOOR(RAND() * 1000));
        set i=i+1;
    end while;
END

数据造好了、我们再插入3条指定的模拟数据、方便我们进行演示。

INSERT INTO `user_info` ( `id`, `name`, `en_name`, `age`, `status`, `description` )
VALUES
	( 1001, '张三', 'Zhang1', 29, 1, '123' ),
	( 1002, '张三', 'Zhang2', 19, 1, '123' ),
	( 1003, '张三', 'Zhang2', 39, 1, '123' ),
	( 1004, '张三', 'Zhang2', 40, 1, '123' );

上面三条数据年龄个位都是9。现在我们要写一条查询用户姓名是"张三"且年龄个位数为"9" 的查询语句。

标准案列:

select * from user_info where name = "张三" and age like "%9";

mysql(四)索引下推,mysql,数据库,crud,mysql,数据库

命中索引: index_name_age_status

 Extra : Using index condition 索引下推。

但是有人疑问了、不是说%在前索引会失效吗? 为什么还是命中索引了。因为我用的是mysql5.8。MySQL5.6添加的索引下推。

索引条件下推优化(Index Condition Pushdown (ICP) )是MySQL5.6添加的,用于优化数据查询。

那么问题来了、我们都是高版本的如何验证模拟不支持索引下推呢

问题1:索引下推如何开启和关闭?(MySQL5.6以后的版本
// 索引下推默认是开启的
set optimizer_switch='index_condition_pushdown=off'; // 关闭
set optimizer_switch='index_condition_pushdown=on'; // 开启

我们先执行关闭语句:

mysql(四)索引下推,mysql,数据库,crud,mysql,数据库

然后再执行

select * from user_info where name = "张三" and age like "%9";

mysql(四)索引下推,mysql,数据库,crud,mysql,数据库

命中索引: index_name_age_status

 Extra : Using where 回表查询。

这是为什么呢、我们先看图

mysql(四)索引下推,mysql,数据库,crud,mysql,数据库

看到图片和下面的话、我们会发现索引下推比回表少了一个1004、我们再看1004主键的数据

( 1004, '张三', 'Zhang2', 40, 1, '123' );

结合上面的我们可以知道、索引下推的时候再索引里面帮我们进行了一次%9的筛选、1004的数据不符合就没有返回进行回表查询。

  • 索引下推(index condition pushdown )简称ICP,在Mysql5.6的版本上推出,用于优化查询。
  • 在不使用ICP的情况下,在使用非主键索引(又叫普通索引或者二级索引)进行查询时,存储引擎通过索引检索到数据,然后返回给MySQL服务器,服务器然后判断数据是否符合条件 。
  • 在使用ICP的情况下,如果存在某些被索引的列的判断条件时,MySQL服务器将这一部分判断条件传递给存储引擎,然后由存储引擎通过判断索引是否符合MySQL服务器传递的条件,只有当索引符合条件时才会将数据检索出来返回给MySQL服务器 。
  • 索引条件下推优化可以减少存储引擎查询基础表的次数,也可以减少MySQL服务器从存储引擎接收数据的次数
问题2:索引下推在哪些情况下无法使用?
        2.1下推条件遇到子查询 
EXPLAIN SELECT
	* 
FROM
	user_info 
WHERE
	NAME = "张三" 
	AND age IN ( SELECT age FROM USER WHERE NAME = "张三" );

mysql(四)索引下推,mysql,数据库,crud,mysql,数据库

我们可以看到查询语句还是命中了(有点翻车)、但是子查询走的全表扫描。所有不建议这样使用。

2.2下推条件遇到函数
EXPLAIN SELECT
	* 
FROM
	user_info 
WHERE
	NAME = "张三" 
	AND age LIKE "%9" 
ORDER BY
	age DESC;

mysql(四)索引下推,mysql,数据库,crud,mysql,数据库

我们看到是回表、不是索引下推。

2.3非InnoDB表和MyISAM表

        这个就不演示了、有兴趣的伙计可以自己改索引方式进行尝试。

注意事项:

        1、索引下推只能存在联合索引里
        2、范围列可以用到索引,但是范围列后面的列无法用到索引
        3、不要使用SELECT * FROM
        4、减少子查询、范围等查询、慎用函数。

 版权声明:转载请附上文章地址DJyzh的博客_CSDN博客-java基础,框架,java高级领域博主 文章来源地址https://www.toymoban.com/news/detail-834271.html

到了这里,关于mysql(四)索引下推的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • MySQL数据库索引机制

    MySQL是一款有客户端和服务端的网络应用,mysql是它的客户端,mysqld是它的服务端。服务端本质就是一个进程,它存在于内存当中。而我们存储在MySQL中的数据是保存在磁盘上的,当我们对MySQL中数据进行增删查改操作时,不可能是直接在磁盘上进行操作,而是将对应的数据加

    2024年02月12日
    浏览(72)
  • MySQL数据库索引的数据结构

    数据库索引的功能就是让查找更加的高效,所以索引的数据结构应该是能够加速查找的数据结构。 MySQL的innoDB存储引擎的索引的数据结构就是多叉搜索树中的b+树,这可以说是为索引量身定做的一个数据结构。 首先,索引可以通过主键,unique修饰创建,也可以直接使用sql语句

    2024年02月10日
    浏览(53)
  • 简单认识MySQL数据库索引

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 ●索引是一个排序的列表,在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址(类似于C语言的链表通过指针指向数据记录的内存地址)。 ●使用索引后可以不用扫描全表来定位某行的

    2024年02月16日
    浏览(65)
  • 【MySQL数据库 | 第十七篇】索引以及索引结构介绍

    目录 前言: 索引简介:  索引结构:           二叉树索引结构         Tree(普通二叉树)         B-Tree(多路平衡查找树)         B+Tree          哈希索引数据结构 总结: 在实际生活中,我们对SQL语句进行优化实际上有很大一部分都是对索引进行优化,因此对索引

    2024年02月09日
    浏览(69)
  • 【MySql系列】深入解析数据库索引

    MySQL索引是数据库中一个关键的概念,它可以极大地提高查询性能,加快数据检索速度。但是,要充分发挥索引的作用,需要深入理解它们的工作原理和使用方式。 在本文中,我们将深入解析MySQL索引,探讨它们的重要性、类型、创建、维护以及最佳实践。 在数据库中,索引

    2024年02月08日
    浏览(71)
  • MySQL数据库索引的种类、创建、删除

    目录 一:MySQL 索引 1、MySQL 索引介绍 2、 索引的作用  3、索引的副作用 4、 创建索引的原则依据  二、索引的分类和创建 1、 普通索引 (1) 直接创建索引 (2) 修改表方式创建 (3) 创建表的时候指定索引 2、 唯一索引 (1) 直接创建唯一索引 (2) 修改表方式创建

    2024年02月09日
    浏览(175)
  • 【Mysql系列】——详细剖析数据库“索引”【上篇】

        😎博客昵称:博客小梦 😊最喜欢的座右铭:全神贯注的上吧!!! 😊作者简介:一名热爱C/C++,算法,数据库等技术、喜爱运动、热爱K歌、敢于追梦的小博主! 😘博主小留言:哈喽! 😄各位CSDN的uu们,我是你的博客好友小梦,希望我的文章可以给您带来一定的帮

    2024年02月02日
    浏览(54)
  • B+树:MySQL数据库索引的实现

    作为一个软件开发工程师,你对数据库肯定再熟悉不过了。作为主流的数据存储系统,它在我们的业务开发中,有着举足轻重的地位。在工作中,为了加速数据库中数据的查找速度,我们常用的处理思路是,对表中数据创建索引。那你是否思考过,数据库索引是如何实现的呢

    2024年02月09日
    浏览(58)
  • MySQL数据库的ID列添加索引

    要为MySQL数据库的ID列添加索引,可以使用以下语法: 其中, table_name 是要添加索引的表名, index_name 是索引的名称, id 是要添加索引的列名。 例如,如果要为名为 users 的表的 id 列添加索引,可以执行以下语句: 这将在 users 表的 id 列上创建名为 idx_id 的索引。 需要注意的

    2024年02月07日
    浏览(50)
  • 【MySQL索引与优化篇】数据库的设计规范

    在关系型数据库中,关于数据表设计的基本原则、规则就称为范式 。范式的英文名称是 Normal Form ,简称 NF 。它是英国人 E.F.Codd 在上个世纪70年代提出关系数据库模型后总结出来的。范式是关系数据库理论的基础,也是我们在设计数据库结构过程中所要遵循的 规则 和 指导方

    2024年02月05日
    浏览(71)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包