mysql(三) 索引-普通索引、复合索引、索引规则等

news2025/4/8 18:13:16

上文我们学习了索引基础知识、所以我画了一个查询语句简单的执行流程、希望可以帮助大家一起学习。

目录

mysql select语句执行流程

普通索引

复合索引

创建索引(三种)

 1、使用INDEX建表的时候创建索引 (创建表时建索引)

INDEX的语法:

INDEX的案例: 

2、使用 CREATE INDEX 语句可以创建普通索引。(就是给指定表新增索引)

CREATE INDEX 的语法:

CREATE INDEX 案例:

3、使用ALTER语句创建(是给指定表、指定指端新增索引)

ALTER的语法:

ALTER的案例:

索引规则 (最常见的)

Using Where(索引回表)

使用explain执行sql(索引回表)

sql执行流程(索引回表)

Using Index(索引覆盖)

使用explain执行sql(索引覆盖)

sql执行流程(索引回表) 

最左匹配:讲了很多遍了、这次讲点不一样的

案例1:age和status做为查询条件

案例2:只用status做为查询条件

Using Index Condition(索引下推)


mysql select语句执行流程

普通索引

        索引能够显著提高查询的速度,尤其是在大型表中进行搜索时。通过使用索引,MySQL 可以直接定位到满足查询条件的数据行,而无需逐行扫描整个表。

        通俗来讲:普通索引,就是在创建索引时,没有任何限制条件(唯一、非空等限制)。该类型的索引可以创建在任何数据类型的字段上。

复合索引

        用户可以在多个列上建立索引,这种索引叫做复合索引(组合索引)

创建索引(三种)

 1、使用INDEX建表的时候创建索引 (创建表时建索引)

INDEX的语法:
INDEX [indexName] (columnName(length))
CREATE TABLE table_name (
  column1 data_type,
  column2 data_type,
  ...,
  INDEX index_name (column1 [ASC|DESC], column2 [ASC|DESC], ...)
);
  • CREATE INDEX: 用于创建普通索引的关键字。
  • index_name: 指定要创建的索引的名称。索引名称在表中必须是唯一的。
  • table_name: 指定要在哪个表上创建索引。
  • (column1, column2, ...): 指定要索引的表列名。你可以指定一个或多个列作为索引的组合。这些列的数据类型通常是数值、文本或日期。
  • ASCDESC(可选): 用于指定索引的排序顺序。默认情况下,索引以升序(ASC)排序。
INDEX的案例: 
CREATE TABLE user( 

  id INT NOT NULL,  

  name  varchar(50) NOT NULL,

  age  INT NOT NULL,

  INDEX index_name (name(50)) 

);

2、使用 CREATE INDEX 语句可以创建普通索引。(就是给指定表新增索引)

普通索引是最常见的索引类型,用于加速对表中数据的查询。

CREATE INDEX 的语法:
CREATE INDEX index_name
ON table_name (column1 [ASC|DESC], column2 [ASC|DESC], ...);
CREATE INDEX 案例:

就1情况种的 user 的表为例(建表不加索引的情况下),包含 id、name 和 age 列,我们将在 name 列上创建一个普通索引。

CREATE INDEX idx_name ON user (name);

 还可以指定索引的排序顺序(案例)默认情况下,索引以升序(ASC)排序

CREATE INDEX idx_name ON user (name DESC);

3、使用ALTER语句创建(是给指定表、指定指端新增索引)

ALTER的语法:
ALTER TABLE tableName ADD INDEX indexName(columnName);
ALTER的案例:
ALTER TABLE user ADD INDEX index_name(name);

索引规则 (最常见的)

   我们先建一张表user_info表、创建组合索引(复合索引) index_name_age (name,age) 让 名称和年龄做为组合索引。 

        如果不清楚索引存储的数据结构是什么样子、请移步mysql(二) 索引-基础知识_DJyzh的博客-CSDN博客文章浏览阅读230次。引擎InnoDB与MyISAM的区别存储文件类型事务支持:行级锁定:外键约束:全文搜索:崩溃恢复:表的大小限制:索引的"样子"模拟B+Tree的数据 图InnoDB(结合数据)图MyISAM(结合数据)图索引的基础知识小结:1、为什么不建议使用过长的字段作为主键2、为什么建议使用增长的数字类型作为主键3、索引失效索引及数据都是存在叶子节点中的,默认的节点大小是16kbinnodb 默认的一页大小为 16384B = 16384/1024 = 16kbhttps://blog.csdn.net/qq_42672839/article/details/129261874?spm=1001.2014.3001.5502

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`);

除了id的主键索引以外、我们新建`name`和 `age`、`status`的组合索引index_name_age_status 。我们再写入1000条数据。

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

建好表和数据、我们正式开始。 

Using Where(索引回表)

        什么样子的查询语句叫做回表查询呢?  本篇开始的 select语句执行流程 不知道大家有么有看懂、我就结合数据再详谈一下。

        比如查询语句如下:

select * from user_info where age = "25";
使用explain执行sql(索引回表)

 执行计划 Extra:  Using where

当执行这个sql时,会发生回表:从某一个索引的叶子结点中获取聚簇索引的id值,根据id再去聚簇索引中获取全量记录 

sql执行流程(索引回表)

如下图红颜色标记的路径

Using Index(索引覆盖)

select age from user_info where name = "李四";
使用explain执行sql(索引覆盖)

 Extra“Using index”值表示使用覆盖索引

  当执行这个sql时,会发生索引覆盖:从索引的叶子结点能获取到全量查询列的过程叫做索引覆盖

sql执行流程(索引回表) 

 如下图红颜色标记的路径

最左匹配:讲了很多遍了、这次讲点不一样的

   我们最常见的最左匹配应该是下面这三种语句:

EXPLAIN  select * from user_info where name = "yzh41";
EXPLAIN  select * from user_info where name = "yzh41" and age = 10 ;
EXPLAIN  select * from user_info where name = "yzh41" and age = 10 and status = 1;

毫无疑问这三个查询语句都命中索引(左边顺序)

那么我们接下来考虑一个问题:最左匹配原则外

`name`,`age`,`status`组合索引查`age`,`status`字段,是否使用组合索引?

我们写几个脚本验证一下

案例1:age和status做为查询条件
select * from user_info where age = 10 and status = 1;
select name from user_info where age = 10 and status = 1;

第一条很明显不会命中索引

 那么第二条呢?

命中了index_name_age_status 索引  Extra“Using index”值表示使用覆盖索引。是不是很神奇?

不急我们再来看一组脚本。

案例2:只用status做为查询条件
select * from user_info where status = 1;

select en_name  from user_info where status = 1;

select name  from user_info where status = 1;

select age  from user_info where status = 1;

select name,status  from user_info where status = 1

我们可以先猜一猜哪些可以命中、哪些不可以

第一条还是很明显不会命中索引

第二条 select en_name  from user_info where status = 1; 没有命中索引 

第三条、第四条、第五条都命中了索引(不一一展示了、大家有兴趣自己模拟)

通过上面的案列我们发现、查询的数据是什么很重要、影响是否走索引。 "*"和 非组合索引字段查询都没有走索引。但是如果字段是否可以被覆盖索引覆盖那么会走索引。

总结:根据最左匹配原则外,还要看select语句中字段是否可以被覆盖索引覆盖,如果有则会直接扫描索引返回结果,没有的话则走全表扫描。

Using Index Condition(索引下推)

        我想单独写一篇、并且画图解释(请等待)

讲了这多上面的演示可能在实际情况中不会如此建立索引(为了演示才如此)、因为索引并不是建的越多就越快。

因为要平衡 空间上的代价时间上的代价的取舍、建索引查询很爽、但是这个表空间的会越大、带来的后续的很多问题。

比如:索引链很多、现在新增插入数据、那么这些索引的维护操作带来的性能损耗

所以合理建索引是表设计和开发设计的重要环节之一。

版权声明:转载请附上文章地址DJyzh的博客_CSDN博客-java基础,框架,java高级领域博主

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1356203.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

osg-材质 (osg::Material)

1.材质类 材质类 (osg::Material)继承自osg::StateAttribute 类。osg::Material 封装了 OpenGL的 glMaterial()和glColorMaterial()指令的函数功能&#xff0c;其继承关系图如图5-27 所示。 图 5-27 osg::Material 的继承关系图 在场景中设置节点的材质属性&#xff0c;首先要…

VS2017 CMake编译Opencv

先下载opencv4.2.0源码以及opencv_contrib-4.2.0 地址链接&#xff1a;https://pan.baidu.com/s/1AgFsiH4uMqTRJftNXAqmTw?pwd3663 提取码&#xff1a;3663 先建立一个opencv_debug和opencv_release文件夹这两个都是为了后续存放编译好的debug版本和release版本opencv的&#…

APP自动化测试工具:八款推荐解析

uiautomator2 github地址&#xff1a;github.com/openatx/uia… UiAutomator 是 Google 提供的用来做安卓自动化测试的一个 Java 库&#xff0c;基于 Accessibility 服务。功能很强&#xff0c;可以对第三方 App 进行测试&#xff0c;获取屏幕上任意一个 APP 的任意一个控件属…

LeetCode---378周赛

题目列表 2980. 检查按位或是否存在尾随零 2981. 找出出现至少三次的最长特殊子字符串 I 2982. 找出出现至少三次的最长特殊子字符串 II 2983. 回文串重新排列查询 一、检查按位或是否存在尾随零 这题和位运算有关&#xff0c;不是很难&#xff0c;题目要求至少有两个数的…

基于SSM的新闻网站

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

基于SSM的班级事务管理系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用Vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

WebSocket的优点和缺点:一文详解。

WebSocket 的优缺点 WebSocket 协议是一种双向通信协议&#xff0c;它使用单个 TCP 连接实现全双工通信&#xff0c;这使它比传统的 HTTP 协议更有效率。 WebSocket 优点 双向通信&#xff1a; WebSocket 协议支持双向通信&#xff0c;使服务器和客户端之间的通信更加方便和快…

googlecode.log4jdbc慢sql日志,格式化sql

前言 无论使用原生JDBC、mybatis还是hibernate&#xff0c;使用log4j等日志框架可以看到生成的SQL&#xff0c;但是占位符和参数总是分开打印的&#xff0c;不便于分析&#xff0c;显示如下的效果: googlecode Log4jdbc 是一个开源 SQL 日志组件&#xff0c;它使用代理模式实…

图像预处理——transforms

一、transforms 运行机制 torchvision是PyTorch的一个扩展库&#xff0c;提供了许多计算机视觉相关的工具和功能。下面是关于torchvision中常用模块的介绍&#xff1a; torchvision.transforms&#xff1a;提供了一系列常用的图像预处理方法&#xff0c;用于对图像进行变换、…

【生成人工智能】Ray如何解决生成人工智能基础设施的常见生产挑战

这是我们生成人工智能博客系列的第一部分。在这篇文章中&#xff0c;我们讨论了如何使用Ray来生产常见的生成模型工作负载。即将发布的一篇博客将深入探讨Alpa等项目为什么要使用Ray来扩展大型模型。 生成的图像和语言模型有望改变企业的设计、支持、开发等方式。本博客重点关…

Spring——Spring IOC(2)

1.Spring中的工厂类 1.1 ApplicationContext ApplicationContext的实现类&#xff0c;如下图&#xff1a; ClassPathXmlApplicationContext&#xff1a;加载类路径下 Spring 的配置文件FileSystemXmlApplicationContext&#xff1a;加载本地磁盘下 Spring 的配置文件 1.2 B…

基于Segformer实现PCB缺陷检测(步骤 + 代码)

导 读 本文主要介绍基于Segformer实现PCB缺陷检测 &#xff0c;并给出步骤和代码。 背景介绍 PCB缺陷检测是电子制造的一个重要方面。利用Segformer等先进模型不仅可以提高准确性&#xff0c;还可以大大减少检测时间。传统方法涉及手动检查&#xff0c;无法扩展且容易出错…

体元法--体积计算

文章目录 环境&#xff1a;1.1 体元法介绍&#xff1a;2.1 python代码3.1 可视化 环境&#xff1a; Open3D 1.1 体元法介绍&#xff1a; 用一个个体素去占据点云&#xff0c;然后对所有体素求和 2.1 python代码 conda activete deeplabv3plus(环境名称–安装好open3D的) py…

python django 生鲜商城管理系统

python django 生鲜商城管理系统,包含用户端和管理端 功能&#xff1a; 用户端&#xff1a;商城主页展示&#xff0c;登录&#xff0c;注册&#xff0c;用户中心&#xff0c;购物车&#xff0c;我的订单&#xff0c;购物车结算 管理端&#xff1a;登录&#xff0c;商品&…

QT的坐标系统,回收机制、菜单栏,工具栏,状态栏,对话框及资源文件

QT的坐标系统&#xff0c;回收机制、菜单栏&#xff0c;工具栏&#xff0c;状态栏&#xff0c;对话框及资源文件 文章目录 QT的坐标系统&#xff0c;回收机制、菜单栏&#xff0c;工具栏&#xff0c;状态栏&#xff0c;对话框及资源文件1、QT的坐标系统&#xff1f;2、对象模型…

顶帽运算在OpenCv中的应用

项目背景 假如我们拍了一张自拍&#xff0c;想为自己的照片添加一个酷炫的火星飞舞的效果&#xff0c;素材库中正好有一张火焰的照片&#xff0c;如果想去除图中的火焰&#xff0c;只保留火星效果&#xff0c;可以使用顶帽子算法 图片中的火星部分正好属于比周围亮一些的斑块…

知虾皮Shopee:东南亚最受欢迎的电子商务平台

在如今数字化时代&#xff0c;电子商务平台成为人们购物的首选方式。Shopee作为东南亚地区最受欢迎的电子商务平台&#xff0c;通过其多样化的商品、便捷的购物体验和创新的商业模式&#xff0c;迅速在该地区占据了重要地位。本文将详细介绍Shopee的特点和优势&#xff0c;以及…

《作家天地》期刊投稿邮箱投稿方式

《作家天地》是国家新闻出版总署批准的正规文学刊物。对各种流派的作品兼收并蓄&#xff0c;力求题材、形式、风格多样化&#xff0c;适用于发表高品质文学学术作品&#xff0c;科研机构的专家学者以及高等院校的师生等。具有原创性的学术理论、工作实践、科研成果和科研课题及…

spug发布问题汇总记录

问题导览 1. [vite]: Rollup failed to resolve import "element-plus" from "src/main.js". 项目框架简介 vue3viteelement-plus 解决方案 - 1. 配置淘宝镜像源&#xff1a;npm config set registry https://registry.npm.taobao.org/ - 2. npm inst…

20240104确认AIO-3399J的开发板适配ov13850摄像头不支持4K分辨率录像

20240104确认AIO-3399J的开发板适配ov13850摄像头不支持4K分辨率录像 2024/1/4 13:23 开发板&#xff1a;Firefly的AIO-3399J【RK3399】 SDK&#xff1a;rk3399-android-11-r20211216.tar.xz【Android11】 Android11.0.tar.bz2.aa【ToyBrick】 Android11.0.tar.bz2.ab Android1…