MySQL之索引(入门级讲解)

news2024/12/22 19:45:08

目录

一.索引的概念  

1.1索引的简介 

1.2.索引的优缺点

二.MySQL索引语法

2.1查看索引

2.2创建索引

2.2.1 创建表时创建索引

 2.2.2存在的表上创建索引

2.3删除索引

三.索引的数据结构      

3.1B+tree索引

 3.2Hash索引

3.4Hash索引和B+tree索引的对比


🎁个人主页:tq02的博客_CSDN博客-C语言,Java,Java数据结构领域博主
🎥 本文由 tq02 原创,首发于 CSDN🙉
🎄 本章讲解内容:MySQL索引

🎁欢迎各位→点赞👍 + 收藏⭐ + 评论📝+关注

🎥学习专栏:  C语言         JavaSE       MySQL基础 

一.索引的概念  

1.1索引的简介 

        索引是什么?本质而言是一种数据结构, 实现通常使用B树及其变种B+树 。

        抽象点:我们把索引比作一本书的目录,而目录的作用就是使我们迅速地找到我们需要的内容,而为什么需要索引?当数据表中含有上亿条数据时,我们进行查询是通过遍历表,一条一条筛选时,是不现实的,但是我们可以使用索引,就可知我们需要的数据大概的位置。

        常见的索引方式:字典,可以有两种方式进行查询,第一种是拼音,第二种是部首,而这就是两种不同的索引方式。

1.2.索引的优缺点

优点:

  1. 可以大大加快数据的检索速度,这也是创建索引的最主要的原因。
  2. 通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。

缺点:

  1. 创建索引需要消耗额外的空间
  2. 有可能会拖慢 增删改 的速度,试想一下,当你修改了数据表的信息时,你的目录也就是索引也可能需要修改的。

结:个人而言,缺点相比较与优点,我们还是利大于弊的,在很多情况下,我们都是以查询操作为主,而增删改较少。


二.MySQL索引语法

        索引分为:普通索引、唯一索引、全文索引、单列索引、多列索引、空间索引

2.1查看索引

        查看索引,有人会问,我未创建索引,也会有索引嘛?在数据库中有三种约束类型存在时会自动生成索引,因此在查询时,即使未创建索引,若有这种条件存在,依然会生成索引。

三种约束类型主键、unique、外键 

也称:主键索引、唯一索引

语法:show index from 表名;


 存在主键时

 主键不允许重复,因此进行插入或者修改时,需要先查询,查看插入/修改后结果是否存在。

存在unique时

存在外键约束时 

当然除了以上的三种,我们还可以查看到手动创建的索引。 


2.2创建索引

  • 索引创建分为2种,第一种是创建表时创建索引,第二种是给存在的表创建索引
  • 索引的创建,前提是表中的数据较少或者无数据,若含有大量数据会引起非常大规模的硬盘IO操作,进一步导致数据库卡死。

2.2.1 创建表时创建索引

语法格式: CREATE TABLE 表名(

                        字段名称 字段类型 [完整性约束条件],

                ...,

[UNIQUE / FULLTEXT / SPATIAL] INDEX / KEY [索引名称](字段名称[(长度)] [ASC|DESC])

);

  • 创建普通索引

创建了2个索引,分别为id和username

CREATE TABLE test1(
id int,
username varchar(20),
index in_id(id),
KEY in_username(username)
);
  • 创建唯一索引
CREATE TABLE test2(
id int,
username varchar(20) unique;    //自动生成
);
  • 创建全文索引
CREATE TABLE test3(
id int
username VARCHAR(20) ,

FULLTEXT INDEX full_userDese(username)
);
  • 创建单列索引
CREATE TABLE test4(
id int UNSIGNED AUTO_INCREMENT KEY,
test1 VARCHAR(20) NOT NULL,
test2 VARCHAR(20) NOT NULL,

INDEX in_test1(test1),
UNIQUE in_test1(test1)
);
  • 创建多列索引
CREATE TABLE test4(
id int UNSIGNED AUTO_INCREMENT KEY,
test1 VARCHAR(20) NOT NULL,
test2 VARCHAR(20) NOT NULL,
test3 VARCHAR(20) NOT NULL,

INDEX mul_t1_t2_t3(test1,test2,test3)
UNIQUE KEY mul_t1_t2_t3(test1,test2,test3)  //二者都可以
);
  • 创建空间索引
CREATE TABLE test1(
id TINYINT UNSIGNED AUTO_INCREMENT KEY,

SPATIAL INDEX spa_test(test)
)ENGINE=MyISAM;

 2.2.2存在的表上创建索引

概念:在存在的表上创建索引,可以直接创建,也可以将某列修改为某种索引

直接创建:CREATE [UNIQUE|FULLTEXT|SPATIAL]  INDEX 索引名称 ON 表名 {字段名称[(长度)] [ASC|DESC]};

简化:create index 索引名 on 表名(字段名)  //其他条件不设置


修改表方式创建:ALTER TABLE 表名  ADD [UNIQUE|FULLTEXT|SPATIAL] INDEX 索引名称](字段名称[(长度)] [ASC|DESC]);                //将某个列修改为索引

  •  创建普通索引

1、CREATE INDEX 索引名  ON 表名(列名);

2、ALTER TABLE 表名  ADD INDEX  索引名(列名);

  • 创建唯一索引

1、CREATE  UNIQUE INDEX 索引名  ON 表名(列名);

2、ALTER TABLE 表名  ADD   UNIQUE INDEX  索引名(列名);

  • 创建全文索引

1、CREATE  FULLTEXT INDEX 索引名  ON 表名(列名);

  • 创建多列索引

1、ALTER TABLE 表名  add INDEX  索引名(列名,列名.....);


2.3删除索引

  • 索引的删除,只能删除手动创建的索引,而自动生成的索引无法删除哦

语法:drop index 索引名 on 表名;


三.索引的数据结构      

    MySQL的索引的数据结构到底是什么样的呢?其实并不是定式的,取决于MySQL使用的存储引擎。

  • 存储引擎: 在mysql程序中,拥有很多模块,有的负责解析sql语句、有的负责网络通信、有的负责存储数据等等。存储引擎就是负责存储数据的,本质而言就是代码中的一个模块(包含了若干个代码文件...以及一大堆具体的代码)

具体如何存储数据,MySQL提供了多种存储方案。而目前最为流行的便是Innodb存储引擎。而Innodb引擎选择使用B+tree索引结构。而至于为什么不选别的索引结构呢?下解:

适合索引的数据结构有 B+tree索引、Hash索引等。

3.1B+tree索引

        B+tree数据结构的演变:二叉树-->红黑树-->B-tree树-->B+tree树,而之所以会逐渐演变,是因为有缺点存在,而为了提高效率,就不断演化。

1.二叉树的缺点

  • 顺序插入时,会形成一个链表,查询性能大大降低。
  • 大数据量情况下,层级较深,检索速度慢。

2.红黑树的缺点

  • 大数据量情况下,层级较深,检索速度慢。

3.B-tree树

        又名:B-树,是一种多叉路衡查找树,对比二叉树,B-树每个结点可以存放多个数值,也就是说一个结点有多个分支,即多叉。

  如图:B-树更趋向于区间查找,根结点是30、40、50、60,所以对应的孩子结点范围为[最小值,30)、[30,40)、[40,50)、[50,60)、[60,最大值].

查询方法:例如查询23,在根结点中找到区间小于30,往下个结,[15,25]区间,找然后又落在了[20,25]区间,再往下找,最终找到叶子结点[21,23],存在。

优点:高度低于红黑树,查询效率更高

缺点:无法进行范围查询

4.B+tree树

        B+Tree是B-Tree的变种,所有的数据都会出现在叶子节点。 叶子节点形成一个单向链表。所有的数据都会出现在叶子节点。 叶子节点形成一个单向链表。

叶子结点,会按照链表的方式,首尾相连,注链表是双向链表,画是单向的,因此只要得到开头和结尾,然后将这段链表单独拉出来便是查询的结果

优点:擅长范围查询,查询速度不快不慢,但是很稳定。


 3.2Hash索引

         哈希索引就是采用一定的hash算法,将键值换算成新的hash值,映射到对应的槽位上,然后存储在 hash表中。如果两个(或多个)键值,映射到一个相同的槽位上,他们就产生了hash冲突(也称为hash碰撞),可以通过链表来解决。

缺点:

  • Hash索引只能用于对等比较(=,in),不支持范围查询(between,>,< ,…)
  • 无法利用索引完成排序操作

优点:查询效率高,通常(不存在hash冲突的情况)只需要一次检索就可以了,效率通常要高于B+tree索引


3.4Hash索引和B+tree索引的对比

因此InnoDB存储引擎选择使用B+tree索引结构的原因:

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

                当你看到这里时,MySQL的索引知识就已经完成了,本文需要细心理解。

                                                                                                       ---------------懒惰的tq02

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

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

相关文章

基于Kitti数据集的智能驾驶目标检测系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于Kitti数据集的智能驾驶目标检测系统可用于日常生活中检测与定位行人&#xff08;Pedestrian&#xff09;、面包车&#xff08;Van&#xff09;、坐着的人&#xff08;Person Sitting&#xff09;、汽车&#xff08;Car&#xff09;、卡车&#xff08;Truck…

[2023新教程]M2 Mac安装Anaconda和Pytorch

本文首发于我的学习之路&#xff1a;https://liguang.wang/index.php/archives/80/ 1 背景 最近使用起了Mac Mini&#xff0c;需要安装Anaconda和Pytorch。网上的教程非常老旧&#xff0c;可读性较差&#xff0c;于是记录下自己的安装过程&#xff0c;分享给大家。 2 详细过…

二十三章:Gated-SCNN:Gated Shape CNNs for Semantic Segmentation ——用于语义分割的门控形状卷积神经网络

0.摘要 当前图像分割的最先进方法通过一个密集的图像表示来处理颜色、形状和纹理信息&#xff0c;这些信息都在深度卷积神经网络内部进行处理。然而&#xff0c;这种方法可能不太理想&#xff0c;因为它们包含了与识别相关的非常不同类型的信息。在这里&#xff0c;我们提出了一…

百度文心一言文心千帆大模型 ERNIE-Bot-turbo调用示例(golang版本)

百度的文心一言推出来也有一段时间了&#xff0c;但是接口部分一直没有公开&#xff0c;需要进行申请 最近&#xff0c;有朋友提供了文心千帆大模型的api权限&#xff0c;拿到了必须的参数&#xff0c;现在就来测试一下 下面是使用golang封装的文心千帆 ERNIE-Bot-turbo模型的调…

2023.7新版Pycharm没有Manager Repository(消失)下载镜像源问题

一、旧版本操作无法找到Manager Repository 二、解决方法---点击左侧键 三、点击添加设置小按钮 四、点击号复制进去镜像源网站即可 五、给大家推荐的镜像源网站 这里清华大学的镜像速度是最快的 https://pypi.tuna.tsinghua.edu.cn/simple/ 清华大学镜像http://pypi.douban…

天然气管道压力监测系统:管网安全守护者

随着我国工业的不断发展和能源需求的日益紧缺&#xff0c;天然气作为一种清洁能源正被广泛地开发和利用。然而。每年因天然气泄漏爆炸而造成的事故层出不穷&#xff0c;不仅威胁着人民的生命安全&#xff0c;还会对环境造成严重污染。面对这样的安全隐患&#xff0c;及时采取措…

Orangepi docker Home Assistant部署

手册上多数应用在树莓派用过&#xff0c;发现一个Home Assistant之前没搞过 按照手册先安装docker&#xff0c;使用enable_docker.sh 然后使用 docker run hello-world 来测试docker是否成功&#xff0c;如果hello from docker&#xff0c;即正常 通过以下docker命令搜索hom…

css - display属性

display属性有四个取值&#xff1a;block inline inline-block none 1、block display是类似于h和p标签在网页中默认显示方式&#xff0c;占据整整一行&#xff0c;所以不会与其他元素共同显示在一行之内。常见的block-display元素还有div、ol ul li、form等。如果想对某个blo…

【PHP面试题80】Redis消息发布与订阅功能怎么用的?

文章目录 &#x1f680;一、前言&#x1f680;二、PHP中安装Redis扩展&#x1f680;三、Redis消息发布与订阅&#x1f50e;3.1 创建发布者&#x1f50e;3.2 创建订阅者&#xff1a;&#x1f50e;3.3 运行发布者和订阅者&#xff1a; &#x1f680;四、总结 &#x1f680;一、前…

tomcat 使用部署

--烛光照亮了晚餐&#xff0c;照不出个答案。 不BB。 --部署web项目&#xff08;无 maven 纯web项目&#xff09; 直接把整个项目放到tomcat的webapps目录的下面然后重启tomcat即可 --部署html静态项目 直接把静态html放到tomcat的webapps目录下面即可&#xff0c;不要重命…

spring中bean实例化的三种方式 -- Spring入门(二)

文章目录 前言1.Bean实例化简介2.bean的实例化 -- 构造方法3.bean的实例化 -- 静态工厂实例化4.bean实例化 -- 实例工厂和FactoryBean5.三种bean实例化方式的区别 总结 前言 为了巩固所学的知识&#xff0c;作者尝试着开始发布一些学习笔记类的博客&#xff0c;方便日后回顾。…

JDBC之用IDEA连接SQLServer数据库实用教程

目录 前言 一、数据库准备 1.通过SQLServer配置管理器打开TCP/IP协议&#xff0c;设置状态为已启用 2.数据库登录模式设置为身份验证登录&#xff08;如果已经设置可忽略此步骤&#xff09; 3.下载SQLServer驱动jar包 二、IDEA准备 1.导入SQLServer驱动jar包 2.编写测试代…

【UE5 多人联机教程】02-开始游戏菜单控件

目录 步骤 一、完善开始游戏菜单控件 二、控件功能实现 2.1 “开始游戏”按钮切换界面 2.2 “创建房间”、“加入房间”按钮切换界面 2.3 “创建房间”按钮 步骤 一、完善开始游戏菜单控件 打开“UMG_Main” 首先在控件切换器外层包裹一个画布面板 然后调整控件切换器全…

Docker-volume【基础使用】

目录 【1】将本地的目录挂载到容器中 【2】volume卷&#xff0c;持久化 【3】volume数据共享 【4】volume持久化的作用 【5】volume - 随机卷的使用方式 【6】 启动nginx容器访问80出现HELLO&#xff0c;访问81出现WORLD 【1】将本地的目录挂载到容器中 1、容器的数据目录…

第112天:免杀对抗-加载器分离无文件落地图片隐写SOCK管道参数协议化

知识点 #知识点&#xff1a; 1、无文件落地&分离拆分-将shellcode从文本中提取-file 2、无文件落地&分离拆分-将shellcode与加载器分离-argv 3、无文件落地&分离拆分-将shellcode远程协议加载-http 4、无文件落地&分离拆分-将shellcode通过管道传输-socket 5、…

设计模式与技术场景面试题详解

工厂方法模式 简单工厂模式 工厂方法模式 抽象工厂模式 策略模式 工厂模式策略模式&#xff08;登录案例&#xff09; 责任链模式 技术场景 单点登录怎么实现 权限认证是如何实现的 上传数据的安全性你们怎么控制 你负责的项目遇到了哪些棘手的问题&#xff1f;怎么解决的 你们…

Vue系列第二篇:初识Vue项目

上一篇我搭建了Vue开发环境&#xff0c;创建了一个demo项目&#xff0c;借助nginx将Vue项目编译部署。这一篇来看一下Vue项目的结构。如下图所示&#xff1a; 我就创建一个空项目&#xff0c;结果Vue脚手架就帮我自动生成了这么多文件&#xff0c;看着挺吓人的。不用怕&#xf…

第十一章、【Linux】正则表达式与文件格式化处理

正则表达式 &#xff08;Regular Expression, RE, 或称为常规表达式&#xff09;是通过一些特殊字符的排列&#xff0c;用以“搜寻/取代/删除”一列或多列文字字串&#xff0c; 简单的说&#xff0c;正则表达式就是用在字串的处理上面的一项“表示式”。正则表达式并不是一个工…

「网络编程」传输层协议_ TCP协议学习_及原理深入理解(一)[万字详解]

「前言」文章内容大致是传输层协议&#xff0c;TCP协议讲解&#xff0c;续上篇UDP协议。 「归属专栏」网络编程 「主页链接」个人主页 「笔者」枫叶先生(fy) 目录 一、TCP协议介绍二、TCP协议2.1 解包与分用2.2 谈谈可靠性2.3 TCP的工作模式2.4 确认应答(ACK)机制2.5 16位序号与…

【基于CentOS 7 的SSH服务】

目录 一、概念 二、特点 三、身份验证机制 1.密码验证 2.密钥对验证 四、验证过程 五、加密机制 1.单向加密 2.对称加密 3.非对称加密 六、基本参数 1.服务名 2.端口号 3.配置文件 3.1 服务器端 3.2 客户端 4.配置文件解析 4.1 /etc/ssh/sshd_config 4.2 /e…