Mysql索引讲解及创建

news2024/12/28 20:57:29

索引介绍

1.什么是索引?
索引是存储引擎中一种数据结构,或者说数据的组织方式,又称之为键key,是存储引擎用于快速找到记录的
一种数据结构。
为数据建立索引就好比是为书建目录,或者说是为字典创建音序表,如果要查某个字,如果不使用音序表,则
需要从几百页中逐页去查。

2.为什么要用索引?
一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,
我们遇到最多的、也是最容易出问题的,还是一些复杂的查询操作,因此对查询语句的优化显然是重中之重。
说起加速查询,就不得不提到索引了。
索引优化应该是对查询性能优化最有效的手段了。索引能够轻易将查询性能提高好几个数量级。

3.正确使用索引
# 先说结论:
索引不是越多越好,并且建议大家最好在提前创建好索引,而不是等问题出现,才想起需要索引
# 详解如下
索引是应用程序设计和开发的一个重要方面。若索引太多,应用程序的性能可能会受到影响。而索引太少,对
查询性能又会产生影响,要找到一个平衡点,这对应用程序的性能至关重要。
当读大于写的时候,构建索引不失为一种提高查询效率的好方法

磁盘相关知识

1)机械磁盘一次IO的时间
机械磁盘一次io的时间 = 寻道时间 + 旋转延迟 + 传输时间
# 寻道时间
道时间指的是磁臂移动到指定磁道所需要的时间,主流磁盘一般在5ms以下
# 旋转延迟
旋转延迟就是我们经常听说的磁盘转速,比如一个磁盘7200转,表示每分钟能转7200次,也就是说1秒钟能转
120次,旋转延迟就是1/120/2 = 4.17ms;
# 传输时间
传输时间指的是从磁盘读出或将数据写入磁盘的时间,一般在零点几毫秒,相对于前两个时间可以忽略不计
所以访问一次磁盘的时间,即一次磁盘IO的时间约等于5+4.17 = 9ms左右
这9ms对于人来说可能非常短,但对于计算机来可是非常长的一段时间,长到什么程度呢?
一台500 -MIPS(Million Instructions Per Second)的机器每秒可以执行5亿条指令,因为指令依靠
的是电的性质,换句话说执行一次IO的时间可以执行约450万条指令,数据库动辄十万百万乃至千万级数据,每次9毫秒的时间,显然是个灾难。

2)磁盘的预读
# 考虑到磁盘IO是非常高昂的操作,计算机操作系统做了一些优化:
当一次IO时,不光把当前磁盘地址的数据,而是把相邻的数据也都读取到内存缓冲区内,因为局部预读性原理告诉我们,当计算机访问一个地址的数据的时候,与其相邻的数据也会很快被访问到。每一次IO读取的数据我们称之为一页(page)。具体一页有多大数据跟操作系统有关,一般为4k或8k或16k,也就是我们读取一页内的数据时候,实际上才发生了一次IO,这个理论对于索引的数据结构设计非常有帮助。

3)索引原理
索引的目的在于提高查询效率,与我们查阅图书所用的目录是一个道理:先定位到章,然后定位到该章下的一个小节,然后找到页数。相似的例子还有:查字典,查火车车次,飞机航班等本质都是:通过不断地缩小想要获取数据的范围来筛选出最终想要的结果,同时把随机的事件变成顺序的事件,也就是说,有了这种索引机制,用数据库也是一样,但显然要复杂的多,因为不仅面临着等值查询,还有范围查询(>、<、between、in)、模糊查询(like)、并集查询(or)等等。数据库应该选择怎么样的方式来应对所有的问题呢?我们回想字典的例子,能不能把数据分成段,然后分段查询呢?最简单的如果1000条数据,1到100分成第一段,101到200分成第二段,201到300分成第三段......这样查第250条数据,只要找第三段就可以了,一下子去除了90%的无效数据。但如果是1千万的记录呢,分成几段比较好?稍有算法基础的同学会想到搜索树,其平均复杂度是lgN(冒泡排序,堆排序,选择排序,快速排序),具有不错的查询性能。但这里我们忽略了一个关键的问题,复杂度模型是基于每次相同的操作成本来考虑的。而数据库实现比较复杂,一方面数据是保存在磁盘上的,另外一方面为了提高性能,每次又可以把部分数据读入内存来计算,因为我们知道访问磁盘的成本大概是访问内存的十万倍左右,所以简单的搜索树难以满足复杂的应用场景。

索引分类

BTREE:B+树索引 (等值查询与范围查询都快)
二叉树->平衡二叉树->B树->B+树
HASH:HASH索引(等值查询与范围查询都快)
将数据打散再去查询
FULLTEXT:全文索引(只可以用在MyISAM引擎)
通过关键字的匹配来进行查询,类似于like的模糊匹配
RTREE:R树索引(空间)

索引数据结构

二叉查找树

图解

二叉查找树的特点就是任何节点的左子节点的键值都小于当前节点的键值,
右子节点的键值都大于当前节点的键值。
顶端的节点我们称为根节点,没有子节点的节点我们称之为叶节点。
利用二叉查找树我们只需要3次即可找到匹配的数据。
如果在表中一条条的查找的话,我们需要6次才能找到。

缺点

1.当我们去查找数据的时候,是以链表的形式去进行查询,
当数据量过于庞大的时候,使用二叉树去进行查询也相当于查询了很多次,
并没有很明显的优化
2.当我们删除数据或者修改数据的时候,会导致两边的层级不一样

平衡二叉树

图解

平衡二叉树主要突出在平衡二字,当我们去插入新的数据或者删除的时候,
平衡二叉树会去调整节点达到平衡,平衡二叉树相较于二叉树来讲,查找速度更快,效率更高

缺点

1.当数据量过大时,使用平衡二叉树去构建索引也会有二叉树同样的缺点,导致层级太高,降低效率
2.当数据量过大时,会导致磁盘的IO过高,因为这种方式是将节点放在磁盘块

B树

图解

在平衡二叉的树的基础上,把更多的节点放入一个磁盘块中,那么平衡二叉树的弊端也就解决了。
即构建一个单节点可以存储多个键值对的平衡树,这就是B树
B树相对于平衡二叉树,每个节点存储了更多的键值(key)和数据(data),并且每个节点
拥有更多的子节点,子节点的个数一般称为阶,上述图中的B树为3阶B树,高度也会很低。 基于这个特
性,B树查找数据读取磁盘的次数将会很少,数据的查找效率也会比平衡二叉树高很多。

缺点

1.B树只擅长做等值查询,而对于范围查询(范围查询的本质就是n次等值查询),
或者说排序操作,B树也会去多次从根节点及叶节点去进行等值查询,对磁盘的IO也会增多

B+树

图解

1、B+树非叶子节点non-leaf node上是不存储数据的,仅存储键,
而B树的非叶子节点中不仅存储键,也会存储数据。
2、B+树的阶数是等于键的数量的。
3、B+树索引的所有数据均存储在叶子节点leaf node,
而且数据是按照顺序排列的。那么B+树使得范围查找,
排序查找,分组查找以及去重查找变得异常简单。
而B树因为数据分散在各个节点,要实现这一点是很不容易的。
而且B+树中各个页之间也是通过双向链表连接的,叶子节点中的数据是通过单向链表连接的。
4、根节点在数据库服务启动时就就加载在内存中。

查找流程(查找id>=18并且id<40的用户数)

索引管理

索引的类型

1)聚集索引
    主键索引,单列索引,唯一性
    创表时定义主键,就会自动生成
    一般在序列号的列上
    一般在创表时就定义了
    在项目中,很少会用主键列作为查找条件

2)非聚集索引
    辅助索引
        单列索引
        唯一索引,主键索引外,保持唯一性的列
        前缀索引,字段比较长,需要通过限制长度来做索引

3)联合索引 *****
    多列索引,需要考虑执行顺序

索引管理的案例练习

环境准备
1.create database world;(有则无需创建)
2.use world;
3.create table stu(id int, name char(20), gender enum('m','f'), age int);

前置知识-怎么查看索引?
1)看表结构,看不清细节
desc stu

+--------+---------------+------+-----+---------+-------+
| Field  | Type          | Null | Key | Default | Extra |
+--------+---------------+------+-----+---------+-------+
| id     | int(11)       | YES  |     | NULL    |       |
| name   | char(20)      | YES  |     | NULL    |       |
| gender | enum('m','f') | YES  |     | NULL    |       |
| age    | int(11)       | YES  |     | NULL    |       |
+--------+---------------+------+-----+---------+-------+

2)查看索引,能看到细节
show index from 库名.表名\G;

创建索引
案例1:在world.stu表中,对id列创建主键索引(仅用来演示,没有这种创建)
方法一:使用modify
alter table world.stu modify id int primary key;
方法二:使用change(需要先写出要修改的字段名再进行变更)
alter table world.stu change id id int primary key;

案例2:在world.stu表中,对name列创建一个辅助索引
方法一:create创建
create index idx_name on world.stu(name);
方法二:alter创建 (这里使用关键字key 和 index 效果一样)
alter table world.stu add index idx_name(name);
alter table world.stu add key idx_name(name);

***案例3:在world.stu表中,对age列创建一个唯一索引***
方法一:create创建
create unique index uni_age on world.stu(age);
方法二:alter创建
alter table world.stu add unique index uni_age(age);

案例4:在world.stu表中,对name列创建一个前缀索引
方法一:create创建
create index idx_name on world.stu(name(4));
方法二:alter创建
alter table world.stu add index idx_name(name(4));

案例5:在world.stu表中,对name、gender、age列创建一个联合索引
方法一:create创建
create index idx_nga on world.stu(name,gender,age);
方法二:alter创建
alter table world.stu add index idx_nga(name,gender,age);

删除
方法一:删除索引
drop index idx_name on world.stu;
方法二:修改表结构
alter table world.stu drop index idx_name;

优化器匹配联合索引的顺序

a,ab,abc 完整索引 

ac 只匹配a 

b,ba,bc,... 不走索引

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

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

相关文章

视频号视频下载教程:如何把微信视频号的视频下载下来

视频号下载相信不少人都多少有一些了解&#xff0c;但今天我们就来细说一下关于视频号视频下载的相关疑问&#xff0c;以及大家经常会问到底如何把微信视频号的视频下载下来&#xff1f; 视频号视频下载教程 视频号链接提取器详细使用指南&#xff0c;教你轻松下载号视频&…

LabVIEW燃料电池船舶电力推进监控系统

LabVIEW燃料电池船舶电力推进监控系统 随着全球经济一体化的推进&#xff0c;航运业的发展显得尤为重要&#xff0c;大约80%的世界贸易依靠海上运输实现。传统的船舶推进系统主要依赖于柴油机&#xff0c;这不仅耗能高&#xff0c;而且排放严重&#xff0c;对资源和环境的影响…

uniapp播放mp4省流方案

背景&#xff1a; 因为项目要播放一个宣传和讲解视频&#xff0c;视频文件过大&#xff0c;同时还为了节省存储流量&#xff0c;想到了一个方案&#xff0c;用m3u8切片替代mp4。 m3u8&#xff1a;切片播放&#xff0c;可以理解为一个1G的视频文件&#xff0c;自行设置文…

Antd 嵌套子表格 defaultExpandAllRows 默认展开不生效

问题描述 在使用 antd 嵌套子表格时&#xff0c;想要默认展开所有子列表&#xff0c;设置属性:defaultExpandAllRows“true”&#xff0c;但是子列表没有展开 原因分析 defaultExpandAllRows 属性官网定义&#xff1a; 从官网定义可知&#xff0c;defaultExpandAllRows 属性…

P2680 [NOIP2015 提高组] 运输计划 第一个测试点信息 || 被卡常,链式前向星应该解决的是vector的push_back频繁扩容的耗时

[NOIP2015 提高组] 运输计划 - 洛谷 目录 测试点信息 P2680_1.in P2680_1.out 图&#xff1a; 50分参考代码&#xff08;开了n^2的数组&#xff0c;MLE了&#xff09;&#xff1a; 测试点信息 Subtask #0 #1 P2680_1.in 100 1 7 97 4 89 2 0 40 91 1 70 84 1 36 92 3 …

ASLR 和 PIE

前言 ASLR&#xff08;Address Space Layout Randomization&#xff0c;地址空间随机化&#xff09;是一种内存攻击缓解技术&#xff0c;是一种操作系统用来抵御缓冲区溢出攻击的内存保护机制。这种技术使得系统上运行的进程的内存地址无法被预测&#xff0c;使得与这些进程有…

Spring Cloud学习

1、什么是SpringCloud Spring cloud 流应用程序启动器是基于 Spring Boot 的 Spring 集成应用程序&#xff0c;提供与外部系统的集成。Spring cloud Task&#xff0c;一个生命周期短暂的微服务框架&#xff0c;用于快速构建执行有限数据处理的应用程序。Spring cloud 流应用程…

【Java设计模式】二、单例模式

文章目录 1、懒汉式2、双重检查3、静态内部类4、饿汉式5、枚举6、单例模式的破坏&#xff1a;序列化和反序列化7、单例模式的破坏&#xff1a;反射 单例模式即在程序中想要保持一个实例对象&#xff0c;让某个类只有一个实例单例类必须自己创建自己唯一的实例&#xff0c;并对外…

mysql的增删改查(常用)

增(insert) 语法&#xff1a; insert into 表名&#xff08;字段&#xff09; values( 字段对应的值) 案例&#xff1a; 创建一个学生表 结构如下&#xff1a; create table student(id int ,name varchar(20),age int); 向表中插入2条数据 create table student(id int ,n…

802.11局域网的 MAC 层协议、CSMA/CA

目录 802.11 局域网的 MAC 层协议 1 CSMA/CA 协议 无线局域网不能使用 CSMA/CD 无线局域网可以使用 CSMA 协议 802.11 的 MAC 层 分布协调功能 DCF 点协调功能 PCF CSMA/CA 协议的要点 2 时间间隔 DIFS 的重要性 SIFS DIFS 3 争用信道的过程 时隙长度的确定 退避…

Java+SpringBoot+Vue+MySQL构建银行客户管理新平台

✍✍计算机毕业编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java、…

HUAWEI Programming Contest 2024(AtCoder Beginner Contest 342)

D - Square Pair 题目大意 给一长为的数组&#xff0c;问有多少对&#xff0c;两者相乘为非负整数完全平方数 解题思路 一个数除以其能整除的最大的完全平方数&#xff0c;看前面有多少个与其余数相同的数&#xff0c;两者乘积满足条件&#xff08;已经是完全平方数的部分无…

2-22 方法、面向对象、类、JVM内存、构造方法

文章目录 方法的重载面向对象类、属性和方法成员变量默认值属性JVM简单内存分析栈空间堆空间 构造方法执行过程构造器注意点 方法的重载 一个类中名称相同&#xff0c;但是参数列表不同的方法 参数列表不同是指&#xff1a; 形参类型形参个数形参顺序 面向对象 field —— …

JAVA工程师面试专题-《JVM篇》

目录 一、运行时数据区 1、说一下JVM的主要组成部分及其作用&#xff1f; 2、说一下 JVM 运行时数据区 &#xff1f; 3、说一下堆栈的区别 4、成员变量、局部变量、类变量分别存储在什么地方&#xff1f; 5、类常量池、运行时常量池、字符串常量池有什么区别&#xff1f;…

Amazon Generative AI | 基于 Amazon 扩散模型原理的代码实践之采样篇

以前通过论文介绍 Amazon 生成式 AI 和大语言模型&#xff08;LLMs&#xff09;的主要原理之外&#xff0c;在代码实践环节主要还是局限于是引入预训练模型、在预训练模型基础上做微调、使用 API 等等。很多开发人员觉得还不过瘾&#xff0c;希望内容可以更加深入。因此&#x…

软件设计师软考题目解析05 --每日五题

想说的话&#xff1a;要准备软考了。0.0&#xff0c;其实我是不想考的&#xff0c;但是吧&#xff0c;由于本人已经学完所有知识了&#xff0c;只是被学校的课程给锁在那里了&#xff0c;不然早找工作去了。寻思着反正也无聊&#xff0c;就考个证玩玩。 本人github地址&#xf…

132.乐理基础-快速识别音程(二)

上一个内容&#xff1a;131.乐理基础-快速识别音程&#xff08;一&#xff09;-CSDN博客 上一个内容里练习的答案&#xff1a; 无论哪两个音&#xff0c;也就是无论升降记号多么离谱&#xff0c;该怎样去判断它是什么音程&#xff0c;首先就要记住&#xff08;现在只需要只需要…

es6 中的生成器 generator / 迭代器 / async /await 到底是个啥,使用场景

生成器 generator 到底是个啥 是一个函数 可以用来遍历数据结构是解决异步编程的一种方案进行数据流的生成和控制协程和状态机返回一个生成器对象/可迭代对象 生成器对象&#xff1a; 生成器对象是由生成器函数返回的对象&#xff0c;它符合迭代器协议&#xff08;Iterator Pr…

车规级MCU的行业走向

1 主要厂家 车规级MCU&#xff08;车用微控制器单元&#xff09;的主要厂家包括&#xff1a; NXP半导体&#xff1a;NXP是全球领先的车规级MCU提供商之一&#xff0c;提供广泛的产品用于汽车控制和管理系统。英飞凌科技&#xff1a;作为汽车半导体的领导者之一&#xff0c;英飞…

现代化数据架构升级:毫末智行自动驾驶如何应对年增20PB的数据规模挑战?

毫末智行是一家致力于自动驾驶的人工智能技术公司&#xff0c;其前身是长城汽车智能驾驶前瞻分部&#xff0c;以零事故、零拥堵、自由出行和高效物流为目标&#xff0c;助力合作伙伴重塑和全面升级整个社会的出行及物流方式。 在自动驾驶领域中&#xff0c;是什么原因让毫末智行…