【SQL应知应会】索引(一)• MySQL版

news2024/11/24 23:17:24

请添加图片描述

欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享,与更多的人进行学习交流

本文收录于SQL应知应会专栏,本专栏主要用于记录对于数据库的一些学习,有基础也有进阶,有MySQL也有Oracle

请添加图片描述

索引 • MySQL版

  • 前言
  • 一、索引
  • 1.简介
    • 1.1 索引的优点
    • 1.2 索引的缺点
  • 2.创建
    • 2.1 索引类型之逻辑分类
      • 2.1.1普通索引(单列索引) 的创建
      • 2.1.2普通索引(单列索引) 的查看
      • 2.1.3 复合索引(组合索引)的创建
      • 2.1.4 复合索引(组合索引)的应用
        • 2.1.4.1 直接使用`select *`查询前面添加索引的表
        • 2.1.4.2 查询具体的字段
        • 2.1.4.3 遵循`最左前缀原则`,对复合索引中的索引字段`按照顺序`进行查询
        • 2.1.4.4 遵循`最左前缀原则`,对复合索引中的索引字段`不按照顺序`进行查询
        • 2.1.4.5 `不`遵循`最左前缀原则`,对复合索引中的索引字段进行查询
        • 2.1.4.6 in & not in
  • 小结

前言

✅今天开始SQL的索引的篇章,同样我们会讲到MySQL和Oracle的索引,大家拭目以待吧
✳️今天这篇主要简单介绍了索引的概念和优缺点,同时直接进入主题——如何创建索引,同时我们会针对索引进行一些分类,而今天讲的是按照逻辑分类后的普通索引(单列索引)以及复合索引,分别讲了索引的创建和应用
✴️文章中提供了代码和很具体的截图,希望大家跟着一起学起来
希望文章的内容对大家有所帮助,如果有什么不足的地方,大家可以在评论区或者私信我,感谢大家的支持
💻那么,快拿出你的电脑,跟着文章一起学习起来吧

一、索引

1.简介

  • 索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。

1.1 索引的优点

  • 索引大大减小了服务器需要扫描的数据量,从而大大加快数据的检索速度,这也是创建索引的最主要的原因。

  • 索引可以帮助服务器避免排序和创建临时表

  • 索引可以将随机IO变成顺序IO

  • 索引对于InnoDB(对索引支持行级锁)非常重要,因为它可以让查询锁更少的元组,提高了表访问并发性

  • 关于InnoDB、索引和锁:InnoDB在二级索引上使用共享锁(读锁),但访问主键索引需要排他锁(写锁)

  • 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。

  • 可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。

  • 在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。

  • 通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。

1.2 索引的缺点

  • 创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加

  • 索引需要占物理空间,除了数据表占用数据空间之外,每一个索引还要占用一定的物理空间,如果需要建立聚簇索引,那么需要占用的空间会更大

  • 对表中的数据进行增、删、改的时候,索引也要动态的维护,这就降低了整数的维护速度

  • 如果某个数据列包含许多重复的内容,为它建立索引就没有太大的实际效果。

  • 对于非常小的表,大部分情况下简单的全表扫描更高效

2.创建

2.1 索引类型之逻辑分类

2.1.1普通索引(单列索引) 的创建

  • 单列索引是最基本的索引,没有任何的限制

  • 方法1:直接创建索引

CREATE INDEX index_name ON table_name(col_name);
  • 方法2:修改表结构的方式添加索引
ALTER TABLE table_name ADD INDEX index_name(col_name);
  • 方法3:创建表的时候同时创建索引
CREATE TABLE news (
    id int(11) NOT NULL AUTO_INCREMENT ,
    title varchar(255)  NOT NULL ,
    content varchar(255)  NULL ,
    time varchar(20) NULL DEFAULT NULL ,
    PRIMARY KEY (id),  -- 默认使用B树索引
    INDEX index_name (title(255)) -- 默认使用B树索引
)

2.1.2普通索引(单列索引) 的查看

  • 可以通过show create table news 查看
CREATE TABLE `news` (
  `id` int NOT NULL AUTO_INCREMENT,
  `title` varchar(255) NOT NULL,
  `content` varchar(255) DEFAULT NULL,
  `time` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `index_name` (`title`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3
  • 也可以通过转储SQL文件进行查看

请添加图片描述

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for news
-- ----------------------------
DROP TABLE IF EXISTS `news`;
CREATE TABLE `news`  (
  `id` int(0) NOT NULL AUTO_INCREMENT,
  `title` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `content` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `time` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE,
  INDEX `index_name`(`title`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;

在这里插入图片描述

2.1.3 复合索引(组合索引)的创建

  • 复合索引是在多个字段上创建的索引
  • 复合索引遵守**“最左前缀”原则**,即在查询条件中使用了复合索引的第一个字段,索引才会被使用。因此,在复合索引中索引列的顺序至关重要。
  • 方法1:创建一个复合索引
create index index_name on table_name(col_name1,col_name2,...);
  • 方法2:按照修改表结构的方式添加索引
alter table table_name add index index_name(col_name,col_name2,...);
  • 方法3:直接使用工具(此处是Navicat)进行添加
    在这里插入图片描述

2.1.4 复合索引(组合索引)的应用

2.1.4.1 直接使用select *查询前面添加索引的表

  • 发现并没有使用到索引 ,而是全表扫描
explain
select * from emp

在这里插入图片描述

2.1.4.2 查询具体的字段

  • 使用到前面添加的复合索引,但是还是要扫描整个索引树
explain
select empno from emp

在这里插入图片描述

2.1.4.3 遵循最左前缀原则,对复合索引中的索引字段按照顺序进行查询

  • 我们发现查询都使用到了索引
explain
select * from emp where empno = '7499'

请添加图片描述

explain
select * from emp where empno = '7499' and ename = 'ALLEN'

请添加图片描述

explain
select * from emp where empno = '7499' and ename = 'ALLEN' and deptno = '30'

请添加图片描述

2.1.4.4 遵循最左前缀原则,对复合索引中的索引字段不按照顺序进行查询

  • 发现使用复合索引的第一个字段,与在SQL语句中的顺序无关
explain
select * from emp where ename = 'ALLEN' and deptno = '30' and empno = '7499' 

在这里插入图片描述

2.1.4.5 遵循最左前缀原则,对复合索引中的索引字段进行查询

  • 发现并没有使用到索引
explain
select * from emp where ename = 'ALLEN' and deptno = '30'

在这里插入图片描述

2.1.4.6 in & not in

  • where in 也会用到索引
explain
select * from emp where empno in (7499,7521)

请添加图片描述

  • not in 没有in的效率高
explain
select * from emp where empno not in (7499,7521)

请添加图片描述

小结

😘感谢大家耐心的看完这篇文章,这篇文章是MySQL索引的第1篇文章,我们在MySQL方面写了很多内容了,大家可以去我的专栏SQL应知应会 进行学习,如果大家觉着还算可以,那么就给个三连支持一下吧
🏡也可以加入我的社区一起学习呀
✅如果想要继续关注和学习后续更多的内容,那就关注一下爱书不爱输的程序猿吧,当然,如果大家还有什么其他方面的知识点想要看,可以在评论区或者私信我

请添加图片描述

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

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

相关文章

业界首个云管理产品与服务图谱发布,九州未来入选!

近日,由中国信息通信研究院和中国通信标准化协会联合主办的第十届可信云大会在北京成功召开,会上发布业界首个云管理全景图《云管理产品与服务图谱(2023)》。 九州未来凭借在云管理领域的多年深耕,成功入选“智慧应用…

【数学建模学习(9):模拟退火算法】

模拟退火算法(Simulated Annealing, SA)的思想借 鉴于固体的退火原理,当固体的温度很高的时候,内能比 较大,固体的内部粒子处于快速无序运动,当温度慢慢降 低的过程中,固体的内能减小,粒子的慢慢趋于有序&a…

无涯教程-Perl - defined函数

描述 如果 EXPR 的值不是undef值,则此函数返回true;如果未指定 EXPR ,则检查$_的值。它可以与许多功能一起使用以检测操作失败,因为如果出现问题,它们将返回undef。简单的布尔测试不会区分false,零,空字符串或字符串.0。 如果 EXPR 是函数或函数引用,则在定义函数…

ORCA优化器浅析——CFunctionProp function properties

CFunctionProp CFunctionProp代表了function properties函数属性,主要由function stability函数易变性( enum EFuncStbl { EfsImmutable, /* never changes for given input */ EfsStable, /* does not change within a scan */ EfsVolatile, /* can ch…

objectMapper.configure 方法的作用和使用

objectMapper.configure 方法是 Jackson 提供的一个用于配置 ObjectMapper 对象的方法。ObjectMapper 是 Jackson 库的核心类,用于将 Java 对象与 JSON 数据相互转换。 configure 方法的作用是设置 ObjectMapper 的配置选项,例如设置日期格式、设置序列…

Stephen Wolfram:超越基础训练

Beyond Basic Training 超越基础训练 The majority of the effort in training ChatGPT is spent “showing it” large amounts of existing text from the web, books, etc. But it turns out there’s another—apparently rather important—part too. 在训练 ChatGPT 的过…

基于短信宝API零代码实现短信自动化业务

场景描述: 基于短信宝开放的API能力,实现在特定事件(如天气预警)或定时自动发送短信(本文以定时群发短信为例)。通过Aboter平台如何实现呢? 使用方法: 首先创建一个IPaaS流程&…

splice没有删除指定元素怎么回事

动态删除数组元素,只能用倒序遍历或者正序遍历时i每次减1 防止遍历时数组元素长度动态改变导致的死循环或者缺漏 注释的需要-1

io day9

1.要求用消息队列实现AB进程对话 a.A进程先发送—句话给B进程,B进程接收后打印 b.B进程再回复—句话给A进程,A进程接收后打印 c.重复1.2步骤,当收到quit后,要结束AB进程 d.实现随时收发:用多进程多线程。 2.要求在共享…

NC 突破性发现!新型分子抑制细菌多重耐药性,重燃抗生素效力的希望

多重耐药性是指细菌病原体在许多结构多样化的化合物的致死剂量下存活的能力。细菌多重耐药性继续以惊人的速度蔓延,威胁着全球人类健康。2019年,细菌多重耐药性直接导致全球1万人死亡,超过艾滋病毒和疟疾的总和。 由于大多数临床抗生素已经对…

Docker卸载安装及国内镜像源(详细版)

文章目录 一、卸载已有Docker1、首先判断本地有没有docker:2、判断CentOS下 docker是否在运行:3、停止docker运行&查看状态4、yum查看docker安装的包并卸载5、删除docker安装目录6、查看docker version 二、Docker安装及镜像源配置1、centOS 7 yum源…

第7集丨Vue 江湖 —— 条件渲染

目录 一、v-show二、v-if2.1 基本使用2.2 条件渲染分组2.3 与 v-else-if、v-else 结合使用 三、v-if vs v-show四、测试案例 本节条件渲染所涉及到的指令有: v-showv-ifv-else-ifv-else 一、v-show 1. 用法: 语法: v-show" 表达式"&#xff…

【CSS】说说对BFC的理解

目录 一、概念 二、BFC的布局规则 三、设置BFC的常用方式 四、BFC的应用场景 1、解决浮动元素令父元素高度坍塌的问题 2、解决非浮动元素被浮动元素覆盖问题 3、解决外边距垂直方向重合的问题 五、总结 一、概念 我们在页面布局的时候,经常出现以下情况&am…

VS2017+CMake+opencv/opencv_contrib 配置报错

请参考https://blog.csdn.net/m0_57433605/article/details/123026901 大佬写的真的很好 添加代理能解决90%问题(甚至100%)

性能问题通用排查思路(一)CPU

本系列文章只是梳理一些常见的线上问题的通用排查思路,能解决70%的问题,对于剩下的30%是一些极端的问题,需要对计算机底层知识有充分的了解,并积累大量问题排查经验,仔细分析才能找到具体原因。 这里基于Linux操作系统…

18、SQL注入之堆叠及WAF绕过注入

目录 堆叠查询注入WAF绕过-SQL注入简要讲解安全狗、宝塔等防护waf策略规则大小写和关键字替换 加密解密编码解码等价函数特殊符号反序列化注释符混用更改提交方式Fuzz大法数据库特性垃圾数据溢出HTTP参数污染 实测简易CMS头部注入漏洞Bypass原理分析 堆叠查询注入 stacked inj…

吃透MySQL面试八股文

内容摘自我的学习网站:topjavaer.cn 什么是MySQL MySQL是一个关系型数据库,它采用表的形式来存储数据。你可以理解成是Excel表格,既然是表的形式存储数据,就有表结构(行和列)。行代表每一行数据&#xff0…

MySQL刷题遇到的盲点(五)窗口函数

窗口函数 语法&#xff1a; <窗口函数> over (partition by <用于分组的列名>order by <用于排序的列名>) partition by&#xff1a;用来对表分组&#xff08; partition 子句可以省略&#xff0c;省略就是不指定分组&#xff09; order by&#xff1a;是…

Python爬虫异常处理心得:应对网络故障和资源消耗

作为一名专业的爬虫代理&#xff0c;我知道在爬取数据的过程中&#xff0c;遇到网络故障和资源消耗问题是再正常不过了。今天&#xff0c;我将与大家分享一些关于如何处理这些异常情况的心得和技巧。不论你是在处理网络不稳定还是资源消耗过大的问题&#xff0c;这些技巧能够帮…

每日一学—浅谈什么是互联网广告系统(文末送书福利2.0)

文章目录 &#x1f4cb;前言&#x1f3af;组成部分&#x1f3af;互联网广告系统案例&#x1f4dd;最后&#x1f3af;文末送书&#x1f4da;作者介绍&#x1f4da;内容简介 &#x1f525;参与方式 &#x1f4cb;前言 互联网广告系统是指在互联网上进行广告投放和管理的系统。它…