【MySQL】索引篇

SueWakeup

                                                      个人主页:SueWakeup

                                                      系列专栏:学习技术栈

                                                      个性签名:保留赤子之心也许是种幸运吧

本文封面由 凯楠📸友情提供

目录

本系列传送门

 1. 什么是索引

2.  索引的特性

3. 索引的分类

4.  索引的优点及缺点

优点

缺点

5. 如何添加索引

添加主键索引

添加唯一索引

 添加普通索引

添加全文索引

 添加联合索引

6. B+Tree 索引(MySQL 5.5 之后默认)

6.1 B+Tree 指向查找操作

6.2 MySQL 为什么选择 B+Tree

7. 哈希索引

8. 什么是回表?

9. 索引覆盖

好处

措施

10. 索引的使用场景

11. 索引的失效场景

12. 索引的优化

 注:手机端浏览本文章可能会出现 “目录”无法有效展示的情况,请谅解,点击侧栏目录进行跳转 


本系列传送门

1. 数据库排名

2.【MySQL】数据库开篇

3.【MySQL】索引篇

4.【MySQL】事务篇

5.【MySQL】锁篇


 1. 什么是索引

  • 索引是一种用于快速查询和检查数据的数据库存储结构,保存了数据库指定字段的数据位置
  • MySQL 最经常用的存储结构: B+Tree 和 Hash
  • 作用:提升数据库的查询性能,如果没有索引,数据库的查询会进行全表搜索,消耗时间,造成大量磁盘的IO操作;如果建立索引,则通过索引中所保存的数据位置,快速找到表中的对应记录

2.  索引的特性

  1. 高效性:利用索引可以提高数据库的查询效率
  2. 唯一性:索引可以确保所查的数据的唯一性
  3. 完整性:加速表和表之间的连接,实现表与表之间的参照完整性
  4. 特殊能力:通过使用索引,可以在查询过程中,使用优化隐藏,提高系统性能

3. 索引的分类

分类方式分类描述
存储方式B+Tree 索引InnoDB 存储引擎的 B+Tree 索引分为主键索引和辅助索引
哈希索引自适应哈希索引
逻辑主键索引主键列使用索引
辅助索引唯一索引保证该数据列的唯一性,允许数据为Null,但不能出现重复数据,一张表允许创建多个唯一索引
普通索引为了快速查询数据,一张表允许创建多个普通索引,允许数据重复和 Null
前缀索引只适用于字符串类型的数据,对文本的前几个字符创建索引,相比普通索引建立的数据更小
全文索引为了检索大文本数据中的关键字的信息,是目前搜索引擎数据库使用的一种技术
使用字段单列索引针对单个列创建的索引,当查询条件只涉及单列时,可以有效提高查询的性能
组合索引针对多个列创建的索引,当查询条件涉及到多个列时,可以提供更好的性能,查询时必须按照索引的顺序提供条件

4.  索引的优点及缺点

  • 优点

    • 加快数据的检索速度,减少数据库需要扫描的数据行数
    • 通过创建唯一索引,可以保证数据库表中每一行数据的唯一性
  • 缺点

    • 创建索引和维护索引需要耗费许多时间
    • 对表中数据进行增删改的时候,如果数据有索引,索引也需要动态的修改,降低SQL的执行效率
    • 索引需要物理文件存储,耗费一定空间
    • 如果数据库的数据量比较小,那么使用索引也不能带来很大提升

5. 如何添加索引

  • 添加主键索引

alter table `table_name` add primary key(`column`)
  • 添加唯一索引

alter table `table_name` add unique(`column`)
  •  添加普通索引

alter table `table_name` add index index_name(`column`)
  • 添加全文索引

alter table `table_name` add fulltext(`column`)
  •  添加联合索引

alter table `table_name` add index index_name(`column1`,`column2`,`column3`)

6. B+Tree 索引(MySQL 5.5 之后默认

  • 因为 B+ Tree 的有序性,所以除了用于查找,还可以用于排序和分组
  • InnoDBB+Tree索引分为主键索引辅助索引
    • 主键索引的叶子节点 data域记录着完整的数据记录
    • 原则:尽量选择访问频率高的字段值作为主键索引
    • 辅助索引的叶子节点data域记录着主键的值,因此在使用辅助索引进行查找时,需要先查找到主键值,然后再到主键索引中进行查找

6.1 B+Tree 指向查找操作

  • 进行查找操作时,首先在根节点进行二分查找,找到对应的叶子节点。然后在叶子节点上进行二分查找,找出 key 所对应的 data
  • 区间查找操作时,由于叶子节点形成了有序列表,可以直接通过指针继续遍历相邻个叶子节点,提高区间查询效率

6.2 MySQL 为什么选择 B+Tree

  1. B+Tree全表扫描能力强,如果基于Btree进行扫描,需要把整棵树遍历一遍,而B+Tree只需要遍历所有叶子节点
  2. B+Tree排序能力更强
  3. B+Tree磁盘读写能力更强,根节点和枝节点不保存数据区,保存的关键字比Btree多。
  4. B+Tree查询性能稳定,B+Tree数据只保存在叶子节点,每次查询数据,查询IO次数是稳定的

7. 哈希索引

  • 能以O(1)时间复杂度进行查找,但是失去了有序性
  • 无法用于排序和分组
  • 只支持精确查找,无法用于部分查找和范围查找
  • InnoDB存储引擎有一个特殊的功能叫”自适应哈希索引“,当某个索引值被使用的非常频繁时,会在B+Tree索引之上创建一个哈希索引,让B+Tree索引具有哈希索引的一些优点

8. 什么是回表?

  • 在使用索引进行查询时,如果查询需要返回的数据不在索引中,MySQL会根据索引中的数据行的主键值再次到表中取检索数据

9. 索引覆盖

一个查询可以完全使用索引来满足,而无需访问实际的数据行

好处

  1. 减少磁盘 IO:从索引中获取,不需要回表访问实际的数据行
  2. 减少内存开销:当查询只涉及到索引列,MySQL只需要将索引数据加载到内存中
  3. 减少了网络传输开销:当数据库和应用程序分布在不同的服务器上时,索引覆盖可以减少从数据库服务器到应用服务器之间的网络传输开销

措施

  1. 使用合适的查询语句:编写查询语句时,明确指定需要返回的列,并确保这些列都包含在索引中。避免使用 select *,它可能无法实现索引覆盖
  2. 合理涉及索引:确保索引包含需要的所有列,尽量覆盖查询所需的列

10. 索引的使用场景

  1. 匹配全值:对索引中所有列都指定具体值,即对索引中的所有列都有等值匹配的条件。
  2. 匹配值的范围查询:对索引的值能够进行范围查找
  3. 匹配最左前缀:仅仅使用索引中的最左边列进行查询。比如组合索引(col1,col2,col3)
  4. 能够被col1,col1+col2,col1+col2+col3的等值查询利用到的。
  5. 仅对索引进行查询:当查询列都在索引字段中。即select中的列都在索引中。
  6. 匹配列前缀:仅仅使用索引的第一列,并且只包含索引第1列的开头部分进行查找。例
  7. 如:WHERE title LIKE ‘xxx%’
  8. 索引部分等值匹配,部分范围匹配
  9. 若列名是索引,则使用column_name is null就会使用索引

11. 索引的失效场景

  1. 使用模糊查询时,%在字符的左侧
  2. 组合索引包含从左到右的字段使用索引,不包含左边的字段索引失效
  3. 数据类型不匹配
  4. 不等于运算(!= 、 <、>、not in)
  5. 字段内容为 null
  6. 添加索引的字段上使用函数或计算
  7. or前后条件中的字段都包含索引或前后有一个字段不包含索引

12. 索引的优化

  1. 选择合适的字段创建索引
  2. 被频繁更新的字段应该慎重建立索引
  3. 尽可能考虑建立联合索引而不是单列索引
  4. 避免冗余索引
  5. 考虑在字符串类型的字段上使用前缀索引代替普通索引
  6. 避免 where子句中对索引字段使用函数,这会造成索引失效

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

绝地求生:AUG爆裂弹球黑货箱:街机动漫风格大家会喜欢吗?

大好&#xff0c;我闲游盒&#xff01; 4.10更新后&#xff0c;AUG的新成长型也出来了&#xff0c;更新后我觉得AUG变好用了一点&#xff0c;不知道大家有没有感觉出来&#xff1f; 宝箱概率 本期主角 AUG-爆裂弹球&#xff08;紫色配粉红色&#xff09; 本次的AUG我才升到5级…

arm内核驱动-中断

先介绍个东西 ctags 这个工具可以像keil一样在工程里查找跳转&#xff0c;帮我们找到我们想要的东西。 安装教程可以找到&#xff0c;这里只讲怎么用。 在工程目录&#xff08;包含所有你会用到的头文件等&#xff09;下&#xff0c;先加载这个命令&#xff0c;可能要等待…

每日一题---OJ题: 链表的回文结构

片头 嗨! 小伙伴们,大家好! 今天我们来一起学习这道OJ题--- 链表的回文结构 嗯...这道题好像不是很难,我们来分析分析 举个例子: 我们可以看到,上图中的两个链表都是回文结构: 即链表的回文结构是指一个链表中的结点值从前往后读和从后往前读都是一样的结构。也就是说&#xf…

vue表格操作列,按钮太多显示... 点击后悬浮显示全部按钮

效果: 分析原理: 一共就三步,仔细看看很简单,位置要加对,代码结构下边有demo 代码结构demo: <el-table-columnlabel"操作"align"center"fixed"right"show-overflow-tooltip><template slot-scope"scope"><el-buttonsi…

前端服务请求跨域被拦截,Java后端Springboot服务解决办法

跨域问题 跨域前端遇到的问题&#xff1a; Access to XMLHttpRequest at ‘http://www.xxx.xxxx/api/x/d/xc’ from origin ‘http://127.0.0.1:3000’ has been blocked by cors policy: No ‘Access-Contorl-Allow-Origin’ header is present on the requested resource. …

npm创建Vue3项目

npm创建Vue3项目 1 创建Vue项目说明 2 安装3 运行 1 创建Vue项目 创建最新版的Vue项目&#xff0c;已经不推荐使用CLI构建方式了。参考如下即可。 npm create vuelatest如果发现一直动不了&#xff0c;切换网络试一下&#xff0c;个人热点尝试一下。 按下图的选项按需引入自…

flask后端+网页前端:基于 socket.io 的双向通信和服务器部署

我想实现的效果是&#xff0c;我的服务器提供两个路由网址&#xff0c;网页A用于拍照、然后录音&#xff0c;把照片和录音传给服务器&#xff0c;服务器发射信号&#xff0c;通知另一个路由的网页B更新&#xff0c;把刚刚传来的照片和录音显示在网页上。 然后网页B用户根据这个…

IntelliJ IDEA(WebStorm、PyCharm、DataGrip等)设置中英文等宽字体,英文为中文的一半(包括标点符号)

1.设置前&#xff08;idea默认字体为 JetBrains Mono&#xff09; 2.设置后&#xff08;楷体&#xff09;

关于游戏当中击退/击飞效果的制作

关于游戏当中击退/击飞效果的制作 在游戏当中我们免不了会有一些炫酷的效果&#xff0c;特别是RPG游戏&#xff0c;比如放一个技能&#xff0c;直接大范围杀伤&#xff0c;然后把敌人全部击飞或者击退&#xff0c;那效果真的很舒服。把自己想象成武林高手&#xff0c;一套江湖…

Debian 安装 Docker

Debian 安装 Docker。 这是官方安装文档 Install Docker Engine on Debian | Docker DocsLearn how to install Docker Engine on Debian. These instructions cover the different installation methods, how to uninstall, and next steps.https://docs.docker.com/engine/i…

⭐Unity 里调用弹出电脑系统文件选择窗 (选择图片/文件)

今天遇到的需求要从Uinty里调用选择程序外的图片&#xff0c;类似手机环境下拿图库的照片一样。 效果如下: 话不多说 直接上代码&#xff01; 1.编辑器模式下 using System.Collections; using System.Collections.Generic; using UnityEngine; using System.IO; using Syst…

Android Studio开发学习(七)———RelativeLayout(相对布局)

在上期中我们对LinearLayout进行了详细的解析&#xff0c;LinearLayout也是我们用的比较多的一个布局,更多的时候更钟情于它的 weight(权重) 属性&#xff0c;等比例划分&#xff0c;对屏幕适配还是 帮助蛮大的;但是使用LinearLayout的时候也有一个问题&#xff0c;就是当界面比…