MySQL学习6:索引

news2024/11/20 8:47:09

来源

教学视频来源:黑马程序员 MySQL数据库入门到精通,从mysql安装到mysql高级、mysql优化全囊括

简介

索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特点查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高价查找算法,这种数据结构就是索引。

使用索引可以提高查询速度,比如查找年龄是45的用户

在这里插入图片描述
注: 上述二叉树索引结构只是一个示意图,并不是真正的索引结构

优点:

  • 提高查询性能:索引可以大大减少查询数据的扫描量,从而提高查询效率。通过使用索引,数据库可以更快地定位和检索所需的数据。

  • 加速排序操作:如果查询中包含排序操作,索引可以加快排序的速度。通过使用索引,数据库可以快速定位并返回排序结果。

  • 提高数据唯一性:可以在索引中定义唯一性约束,确保表中的数据不重复。

  • 支持快速聚合操作:对于包含聚合函数的查询,索引可以提供更快的结果计算和返回。

缺点:

  • 占用存储空间:索引需要占用额外的存储空间。随着索引的增加,数据库的存储需求也会增加。

  • 增加写操作的开销:当对表进行插入、更新和删除操作时,索引也需要进行相应的更新。因此,索引会增加写操作的开销,对性能产生一定的影响。

  • 维护索引需要时间:当表中的数据发生变化时,索引也需要相应地进行维护。这会导致写操作的延迟增加。

  • 不适用于所有情况:对于某些小型表或者数据分布不均匀的表,使用索引可能不会带来明显的性能提升,甚至可能降低查询性能。

索引结构

MySQL中的索引是在存储引擎层实现的,不同的存储引擎有不同的结构,主要包含一下几种:
在这里插入图片描述

InnoDB存储引擎使用的是B+tree索引结构。原因是:

  • 相对于二叉树,层级更少,搜索效率更高
  • 对于B-tree,无论是叶子节点还是非叶子节点,都会保存数据,这样导致一页中存储的键值减少,指针跟着减少,要同样保存大量数据,只能增加树的高度,导致性能降低。
  • 相对于Hash索引,B+tree支持范围匹配及排序操作

索引分类

在这里插入图片描述
在InnoDB存储引擎中,根据索引的存储形式,又可以分为以下两种:
在这里插入图片描述
聚集索引选取规则:

  • 如果存在主键,主键索引就是聚集索引
  • 如果不存在主键,将使用第一个唯一索引作为聚集索引
  • 如果表没有主键,或没有合适的唯一索引,则InnoDB会自动生成一个rowid作为隐藏的聚集索引

索引语法

创建索引

create [unique | fulltext] index index_name  on table_name(index_col_name,...)

查看索引

show index from table_name

删除索引

drop index index_name on table_name

通常主键为主键索引,如果使用主键来查询数据会比使用其他字段查询的速度会更快。如果需要使用其他字段来进行查询时,当数据量过大时,可以通过创建索引来提示查询效率。

注: 当数据量过大时,构建索引也会花费一些时间

索引使用

查看使用了哪些索引

我们在执行查询语句时,可以在查询语句前面加上explain关键字,来查看该查询语句使用了哪些索引

在这里插入图片描述

使用原则

最左前缀法则

如果索引了多列(联合索引,由多个列组成的索引),要遵守最左前缀法则。最左前缀法则指的是查询从索引的最左列开始,并且不跳过索引中的列。

如果查询条件没有按照索引的最左前缀顺序提供,MySQL将无法充分利用索引,可能会导致全表扫描或部分索引扫描,从而影响查询性能。

如果跳过某一列,索引将部分失效(后面的字段索引失效)

例如,如果您创建了一个复合索引 (col1, col2, col3):

  • 只使用col1列,索引生效
  • 使用col1,col2 索引生效
  • 全部都使用(字段的顺序不一定是col123,也可以是col321),索引生效
  • 使用col1、3,只有col1的索引生效

范围查询
联合索引中,出现范围查询(大于、小于),范围查询右侧列的索引失效。大于等于这种的会生效
例如下面这条sql,后面的 and sex = '男' 是不会生效

select * from student where profession = '软件工程' and age > 23 and sex = '男'

索引列运算
不要在索引列上进行运算操作,索引将失效。

字符串
字符串类型字段使用时,不加引号,索引将失效。这里指的是字符串类型的数字

模糊查询
如果是头部模糊匹配,索引失效,比如:

explain select * from student where name like '%四'

or连接的条件
or分割的条件,如果or前的条件中有列索引,而后面的列中没有索引,那么涉及的索引都不会被用到

数据分布影响
在执行查询时,MySQL会进行评估,如果使用索引比全表扫描更慢,则不适用索引

前缀索引

当字段类型为字符串时,有时候需要索引很长的字符串,这会让索引变得很大,查询时浪费大量的磁盘IO,影响查询效率。
此时可以只将字符串的一部分前缀,建立索引,这样可以大大节约索引空间,从而提高索引效率。

语法

// index_name:索引名称    table_name:表名    column:列    n:指定几个字符
create index index_name on table_name(column(n))

前缀长度
可以根据索引的选择性来决定,而选择性是指不重复的索引值和数据表的记录总数的比值,索引选择性越高则查询效率越高,唯一索引的选择性是1,这是最好的索引选择性,性能也是最好的。

计算方式示例

select count(distinct name) / count(*) from student;

在这里插入图片描述
判断应该截取几个字符

select count(distinct substring(name,1,10)) / count(*) from student;

通过修改截取的字符串长度来计算几个字符比较合适后就可以创建前缀索引了,比如:create index index_name_3 on student(name(3))

单例索引与联合索引的选择问题

  • 单列索引:一个索引只包含单个列
  • 联合索引:一个索引包含了多个列

在业务场景中,如果存在多个查询条件,考虑针对查询字段建立索引时,建议建立联合索引,而非单例索引。

索引设计原则

  • 针对数据量较大(几十万数据),且查询比较频繁的表建立索引
  • 针对于常作为查询条件、拍下、分组操作的字段建立索引
  • 尽量选择区分度高的列作为索引,尽量建立唯一索引,区分度越高,使用索引的效率越高
  • 如果是字符串类型的字段,字段的长度较长,可以针对于字段的特点,建立索引
  • 尽量使用联合索引,减少单列索引,查询时,联合索引很多时候可以覆盖索引,节省存储空间,避免回表,提高查询效率
  • 要控制索引的数量,索引并不是多多益善,索引越多,维护索引结构的代价也就越大,会影响增删改查的效率
  • 如果索引列不能存储null值,请在创建表时使用not null约束它。当优化器知道每列是否包含null值时,它可以更好的确定哪个索引更有效的用于查询。

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

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

相关文章

vue事件处理表单输入绑定

1.监听事件 我们可以使用 v-on 指令 (简写为 ) 来监听 DOM 事件,并在事件触发时执行对应的 JavaScript。用法:v-on:click"handler" 或 click"handler"。 事件处理器 (handler) 的值可以是: 内联事件处理器:事…

使用Git把项目上传到Gitee的详细步骤

1.到Git官网下载并安装 2.到Gitee官网进行注册,然后在Gitee中新建一个远程仓库 3.设置远程仓库的参数 4.返回Gitee查看仓库是否生成成功 5.新建一个文件夹作为你的本地仓库 6.将新建好的文件夹初始化成本地仓库 第一步:右键点击刚创建的本地仓库&#…

2003-2018年各省能源结构(煤炭占比)(含原始数据和计算过程)

2003-2018年各省能源结构(煤炭占比)(含原始数据和计算过程) 1、时间:2003-2018年 2、指标:原煤、洗精煤、其他洗煤、型煤、焦炭、焦炉煤气、其他煤气、其他焦化产品、原油、汽油、煤油、柴油、燃料油、液…

基于python解决鸡兔同笼问题

一、什么是鸡兔同笼问题? 鸡兔同笼问题是一个经典的数学问题。问题描述:鸡和兔子共有头数a和脚数b,求鸡和兔子的数量。 解析:设鸡的数量为x,兔子的数量为y,那么可以得到以下两个方程: 1. x y…

C++ PrimerPlus 复习 第二章 进入c++

第一章 命令编译链接文件 make文件 文章目录 创建C程序;C程序的一般格式;main()函数;使用cout对象进行输出,使用cin对象进行输入;coutcin #include编译指令;名称空间定义和使用简单函数。在C程序中加入注释&#xff1…

Nginx配置指南:如何定位、解读与优化Linux上的Nginx设置

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🐅🐾猫头虎建议程序员必备技术栈一览表📖: 🛠️ 全栈技术 Full Stack: &#x1f4da…

Harmony系统更改手机IP

在当今的互联网环境中,我们经常需要更改手机的IP地址来绕过限制或保护我们的隐私。虽然在一些操作系统上更改IP地址相对较容易,但在Harmony系统上,这可能会有些困难。因此,本文将分享一种在Harmony系统上免费更改手机IP地址的方法…

linux 下实现一个进度条

倒计时 理解 printf 打印的内容是被放在输出缓冲区的 fflush(stdout) 刷新 输出缓冲区;\n 也是一种刷新的策略我们称之为行刷新 理解一下回车换行 首先:回车是回车 换行是换行 回车是回到这一行的开头 换行是换到下一行 所以我们平时使用的 Enter 键 …

一线大厂Redis高并发缓存架构实战与性能优化

多级缓存架构 缓存设计 缓存穿透 缓存穿透是指查询一个根本不存在的数据, 缓存层和存储层都不会命中, 通常出于容错的考虑, 如果从存储层查不到数据则不写入缓存层。 缓存穿透将导致不存在的数据每次请求都要到存储层去查询, 失…

二叉树的概念及存储结构

目录 1.树的概念 1.1树的相关概念 1.2树的表示与应用 2.二叉树的概念及结构 2.1二叉树的概念 2.1.1特殊的二叉树 2.2.2二叉树的性质 2.2二叉树的结构 2.2.1顺序存储 2.2.2链式存储 这是一篇纯理论的博客,会对数据结构中的二叉树进行详细的讲解,让你对树的能有个清晰的…

智能语音机器人竞品调研

一、腾讯云-智能客服机器人 链接地址:智能客服机器人_在线智能客服_智能客服解决方案 - 腾讯云 二、阿里云-智能语音机器人 链接地址:智能对话机器人-阿里云帮助中心 链接地址:智能外呼机器人的业务架构_智能外呼机器人-阿里云帮助中心 三、火…

word文档怎么转换成pdf?几个实用文档转换方法

word文档怎么转换成pdf?PDF文档可以保护文档的格式和布局。如果你将Word文档发送给他人,他人可能会使用不同版本的Word软件打开文档,导致格式和布局发生变化。但是,如果你将Word文档转换为PDF文档,无论对方使用什么软件…

Android Studio的笔记--Android API的方法和位置

Android API 官网API中文API源码位置 官网API Package Index 可以修改查看对应的API等级的方法 中文API Android 包索引 源码位置 在工程的位置如下 \frameworks\base\core\java\android\ 与君共勉!

聚观早报 | iPhone 15系列正式发布;月饼专利申请超10000项

【聚观365】9月14日消息 iPhone 15系列正式发布 月饼专利申请超10000项 “五个女博士”自建研究院 2023中国民营企业研发十强公布 华为和小米达成全球专利交叉许可协议 iPhone 15系列正式发布 2023年苹果秋季新品发布会如期而至。发布会上,苹果发布了iPhone 1…

visual studio code导入自定义模块(pycharm中能够运行的文件,vs code报错:未找到指定模块)

一、先看下目录结构 二、在main.py中导入Utils中的模块,直接导入即可 from Utils.custom_event_parse import CustomEventParse三、在custom_event_parse.py中导入execl_base.py中的模块 导入模块: from Utils.execl_base import ExeclBase以上这种导…

微信小程序线上加载使用iconfont问题

1.在微信小程序根目录下创建style文件夹,里面再创建iconfont文件夹,用于放置iconfont图标文件和iconfont样式文件 2.给iconfont.wxss写样式(也可以下载iconfont代码,拷贝iconfont.css里的代码复制进去) font-face {fo…

深度学习-全连接神经网络-训练过程-模型正则与超参数调优- [北邮鲁鹏]

目录标题 神经网络中的超参数学习率超参数优化方法网格搜索法随机搜索法 超参数搜索策略粗搜索精搜索 超参数的标尺空间 神经网络中的超参数 超参数 网络结构:隐层神经元个数,网络层数,非线性单元选择等优化相关:学习率、dorpou…

【绝㊙️】三年开发内功心得

经典嵌套if-else问题 这个也是老生常谈问题了,不管哪里都能看到。 那如何解决 方法一(重要): 如果逻辑分支过多, 即使你不解决嵌套if-slse,至少也要把每个 if的{}里的逻辑抽到一个独立的方法或者工具类…

NDK (ndk)报错 Unity requires NDK r19 (64-bit)(19.0.05232133)

一、介绍 在 Android 添加 NDK ndk 的时候,出现 Unity requires NDK r19 (64-bit)(19.0.05232133)。 二、环境 1、Unity 2020.3.48f1c1 2、Android NDK 配置 三、报错信息 NDK (ndk)报错 Unity requires NDK r19 (64-bit)(19.0.05232133) 四、解决方法 1、下…

GDB之解决ptrace反调试手段(八)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…