首页 > 数据库 >Mysql联合索引和索引条件下推

Mysql联合索引和索引条件下推

时间:2024-07-18 11:53:58浏览次数:10  
标签:varchar DEFAULT 下推 索引 Mysql test 20 NULL

1、概念介绍

联合索引

联合索引和聚集索引一样使用B+树结构存储,联合索引的索引节点存储多个键值对,按首列数值排序,叶子节点存放所有的索引值以及对应的主键,如果需要查询非联合索引中的字段需要进行回表查询。联合索引的大小小于聚集索引。

索引覆盖

InnoDB存储引擎支持覆盖索引(covering index,或称索引覆盖),即从辅助索引中就可以得到査询的记录,而不需要査询聚集索引中的记录。使用覆盖索引的一个好处是辅助索引不包含整行记录的所有信息,故其大小要远小于聚集索引,因此可以减少大量的IO操作。

当使用索引覆盖时,可在执行计划的列Extra看到Using index提示。

索引条件下推优化(ICP)

索引条件下推(ICP)是针对 MySQL 使用索引从表中检索行的情况的优化。如果没有 ICP,存储引擎会遍历索引以查找表中的行,并将其返回给 MySQL 服务层, 由MySQL 服务层执行WHERE条件。启用 ICP 后,如果仅使用索引中的列可以评估部分 WHERE 条件,则 MySQL 服务层会将这部分 WHERE 条件下推到存储引擎。然后,存储引擎使用索引条目评估推送的索引条件,并且仅当满足此条件时,才从表中读取行。ICP可以减少回表的次数。

当优化器选择Index Condition Pushdown优化时, 可在执行计划的列Extra看到Using index condition提示。

2、例子

test表

CREATE TABLE `test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `a` varchar(20) DEFAULT NULL,
  `b` varchar(20) DEFAULT NULL,
  `c` varchar(20) DEFAULT NULL,
  `d` varchar(255) DEFAULT NULL,
  `e` varchar(255) DEFAULT NULL,
  `f` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `a` (`a`,`b`,`c`),
  KEY `a_2` (`a`,`b`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=100012 DEFAULT CHARSET=latin1

test2表

CREATE TABLE `test_2` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `a` varchar(20) DEFAULT NULL,
  `b` varchar(20) DEFAULT NULL,
  `c` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `a` (`a`,`b`,`c`),
  KEY `a_2` (`a`,`b`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=100012 DEFAULT CHARSET=latin1

test_2表只是比test表多了一些字段

例子1:

select * from test WHERE a="004yy3jzLU" and c = "pe7u0ucBP1";

explain
image

使用了索引下推

接着对test_2表执行同样的sql语句

select * from test_2 WHERE a="004yy3jzLU" and c = "pe7u0ucBP1"

explain
image

test_2表使用了索引覆盖,无需回表,因为索引a中包含了所有的需要返回的字段。

例子2:

select a,b,c from test_2 WHERE a="004yy3jzLU" and c = "pe7u0ucBP1"

explain

image

使用了覆盖索引,无需回表。

标签:varchar,DEFAULT,下推,索引,Mysql,test,20,NULL
From: https://www.cnblogs.com/hekk/p/18295544

相关文章

  • mysql函数使用总结
    计算视频的完播率:https://www.nowcoder.com/discuss/353150021023506432?urlSource=sitemapSELECTvideo_id,ROUND((100*comp_play_rate+5*like_cnt+3*comment_cnt+2*retweet_cnt)/(TIMESTAMPDIFF(DAY,recently_end_date,cur_date)+1),0)ashot_indexFR......
  • docker-compose -- 创建 redis && mysql
    version:'3'services:nest-admin-web:image:buqiyuan/vue3-antdv-admin:stablecontainer_name:nest-admin-webvolumes:-./deploy/web:/etc/nginx/conf.dports:-'80:80'restart:alwaysnetworks:......
  • 一些数据库专家称,最新的 MySQL 版本令人失望
    据分析师认为,Oracle 的重点在其他方面,但要说所有创新都可以在社区版中运行是“不公平”的。MySQL 的最新版本让一些评论员和开发者们感到失望,他们担心开源数据库的管理者Oracle可能有其他的“优先事项”。本月初,长期以来一直推销其自有专有数据库系统的Oracle发布了MySQL ......
  • Java语言,MySQL数据库;基于Node+Vue的健康信息管理系统的设计与实现32355(免费领源码)计算
    Node.js健康信息管理系统的设计摘要在如今IT技术快速发展和Internet广泛应用的时代,电子和网络技术给人们生活带来了便利,同时也会直接或间接损害人们的健康。所以,本次的毕业设计创作的意义就是通过信息化的统一管理,给用户录入和查看健康信息提供了方便。本设计主要实现集人......
  • 使用SqlSugar操作MySQL/SQL Server数据库
    一、框架简介SqlSugar 是一款老牌.NET开源ORM框架,由果糖大数据科技团队维护和更新,开箱即用最易上手的ORM 优点:【生态丰富】【高性能】【超简单】【功能全面】【多库兼容】【适合产品】 二.SqlSugar连接MySQL数据库publicclassMySqlCNHelper:Singleton......
  • 用php编写代码,实现Linux系统下源码安装Apache、Mysql、PHP以及LAMP部署验证的过程
    以下是使用PHP编写的代码示例,用于自动化安装和部署LAMP环境:<?php//定义安装路径和版本号$apacheVersion='2.4.41';$mysqlVersion='8.0.19';$phpVersion='7.4.4';$apacheInstallPath='/usr/local/apache';$mysqlInstallPath='/usr/local/my......
  • Linux下数据库学习过程之索引视图(持续更新中)
    1视图创建视图的目的:使得查询操作更加便捷视图的语法CREATE[ORREPLACE][ALGORITHM={UNDEFINED|MERGE|TEMPTABLE}][DEFINER=user][SQLSECURITY{DEFINER|INVOKER}]VIEWview_name[(column_list)]ASselect_statement[W......
  • 【第4章】Spring Cloud之Nacos单机模式支持mysql
    文章目录前言一、初始化1.初始化数据库2.修改配置文件二、效果1.重新启动2.新增用户总结前言在0.7版本之前,在单机模式时nacos使用嵌入式数据库实现数据的存储,不方便观察数据存储的基本情况。0.7版本增加了支持mysql数据源能力,具体的操作步骤:安装数据库,版本要......
  • [Mysql]next-key lock
    next-keylock这一节我们通过实验验证next-key-lock在各种情况下的表现:在唯一索引上的等值查询我们利用主键展现这一特性命中记录下面我们来解释这张图发生了什么,会话A会话B1开启事务开启事务2快照读整张表,查到所有数据3对id为10的数据进行加forup......
  • mysql数据库常用命令
    mysql数据库创建表的内容需要声明数据类型,数据类型分为整数Int、浮点数也就是小数、字符串、日期时间data。如id的话需要用整数int,商品价格的话用浮点数,名字用字符串varchar(30)括号里面是字符串的长度。常用命令:1、声明要使用的数据库use名称;2、创建表createtabletest(......