MySQL--索引类型详解

索引的类型

主键索引:

PRIMARY KEY,当一张表的某个列是主键的时候,该列就是主键索引,一张表只允许有一个主键索引,主键所在的列不能为空。

创建主键索引的SQL语法:

# 给user表中的id字段创建名为id_index的主键索引,使用ALTER创建主键索引
ALTER TABLE `user` ADD PRIMARY KEY id_index(`id`);

注意主键索引不能使用create index语句创建。

唯一索引:

unique ,一个或多个列组成组成唯一,就可以做唯一索引,一个表可以有多个唯一索引,唯一索引的列不能为空。

创建唯一索引的SQL语法:

# 给user表中的user_name字段创建名为index_name 的唯一索引
CREATE UNIQUE INDEX index_name on user(user_name)

普通索引:

最基本的索引类型,没有限制,可以为空,可以有多个。

# 给user表中的age字段创建名为index_age 的唯一索引
CREATE INDEX index_age on user(age)

联合索引:

也称复合索引,就是在多个列上建立的索引。

# 给user表中的address、hobby字段创建名为index_address_hobby 的联合索引
CREATE INDEX index_address_hobby on user(address,hobby)

覆盖索引:

个人理解覆盖索引就是一种特殊的联合索引,就是查询的列在索引中就可以获取到,无需读取数据行,使一种查询手法的优化。

# 给user表中的name、age、gender字段创建名为index_name_age_gender的索引
CREATE INDEX index_name_age_gender on user(name,age,gender)

全文索引:

全文索引的类型是FullText,全文索引只支持varchar、char、text类型的列上创建,MyISAM支持全文索引,InnoDB在MySQL5.6之后支持了全文索引(项目中在MySQL上使用全文索引的场景不太多,后面会更新一篇全文索引使用详解)。

# 给user表中的name字段创建全文索引
ALTER TABLE useradd FULLTEXT(name);

索引结构分类(InnoDB存储引擎):

按索引的存储结构分类,索引可以分为主键索引和二级索引(辅助索引),普通索引、联合索引、覆盖索引都可以理解为二级索引的某一种。

主键索引和二级索引(InnoDB存储引擎):

主键索引的特点:

  • 唯一,主键索引要求列的值必须唯一。
  • 非空,主键索引要求列不能为空。
  • 是聚集索引,非叶子节点不存储数据,叶子节点数据有序。
  • 效率高,通过主键索引可以快速的定位到表中的唯一一行数据。

主键索引树的结构实例:

在这里插入图片描述

二级索引的特点:

  • 叶子节点存储的是二级索引所在行的主键索引。
  • 非叶子节点存储的是完整的索引关键字信息。
  • 遵循最左前缀原则。
  • 支持更为丰富的查询场景。

单列索引树的结构实例:

在这里插入图片描述
联合索引树的结构实例:

在这里插入图片描述

索引相关实用型SQL语法

ALTER TABLE和CREATE INDEX 语法的区别?

  • ALTER TABLE 可以创建主键索引,而CREATE INDEX 不可以创建主键索引。
  • CREATE INDEX 必须提供索引名,ALTER TABLE 如果没有指定索引名称,则会将自动创建。
  • CREATE INDEX 一个语句只能创建一个索引,ALTER TABLE 可以创建多个。
 ALTER TABLE user ADD INDEX(column1),ADD INDEX(column2);

查看索引和删除索引的SQL语法:

 #查看tablename的所有索引SHOW INDEX  FROM tablename;#删除tablename中的索引index_name DROP INDEX index_name ON tablename;  ;

隐藏索引:

隐藏索引功能可以作为一个SQL调优的小技巧,通过隐藏索引用来测试索引的性能,验证索引的必要性,避免了频繁删除新建索引,SQL调优完成,如果不影响性能再真正地删除索引。

 #隐藏tablename 的索引index_name 
ALTER TABLE tablename ALTER  INDEX  index_name INVISIBLE; #取消tablename 的索引index_name 的隐藏
ALTER TABLE tablename ALTER  INDEX  index_name VISIBLE;   

索引的优点:

  • 根据业务场景合理创建索引,可以大大提高各种查询速度,特别是在数量量大的情况下。
  • 唯一索引可以避免数据重复插入。

索引的缺点:

  • 索引需要占用存储空间。
  • 对数据进行增删改的时候,还需要同时维护索引,有一定的开销。
  • 索引设计不合理或者索引过多,可能会影响查询效率。

索引设计原则:

  • 经常作为查询条件的字段创建索引。
  • 经常需要分组、排序的字段创建索引。
  • 在辨识度高的字段建立索引,如果是0、1这种类型的字段建议不要创建索引了。
  • 尽量创建联合索引,少创建单列索引。
  • 控制索引的数量,不要过多的为一个表创建索引。
  • 及时删除用不到的索引。

如有不正确的地方请各位指出纠正。

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

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

相关文章

安科瑞微电网智慧能源平台【能源规划、协调控制、经济运行】

背景 1“双碳”目标 重视能源消费侧节能减碳 碳排放权、碳资产、碳交易 2市场、行业发展 光伏建设成本降低、储能设备成本大幅下降、新能源汽车快速发展,大量充电桩建设 3用户需求 降低用能成本、增加能源收益、避免“能耗双控”,提高用电可靠性、…

最适合Oracle数据库的Linux操作系统?

先声明:以下观点仅供参考。我只引用网上的一些观点,包括官网等。 Oracle数据库认证的Linux操作系统 最近老被问到Oracle Linux免费吗?因为用户需要安装Oracle数据库,面临选择操作系统的问题。 首先,Oracle数据库 19…

Transformer模型引领NLP革新之路

在不到4 年的时间里,Transformer 模型以其强大的性能和创新的思想,迅速在NLP 社区崭露头角,打破了过去30 年的记录。BERT、T5 和GPT 等模型现在已成为计算机视觉、语音识别、翻译、蛋白质测序、编码等各个领域中新应用的基础构件。因此&#…

YOLOv5原创改进:原创自研head创新 | 空间上下文感知模块(SCAM)结合超轻量高效动态上采样DySample | 小目标涨点系列

💡💡💡本文独家改进:YOLOV5 head创新,1)一种超轻量高效动态上采样DySample, 具有更少的参数、FLOPs,效果秒杀CAFFE和YOLOv8网络中的nn.Upsample;2)加入空间上下文感知模块(SCAM)进一步提升检测精度; 改进结构图如下: 💡💡💡在多个数据集下验证能够涨点…

3d场景重建图像渲染 | 神经辐射场NeRF(Neural Radiance Fields)

神经辐射场NeRF(Neural Radiance Fields) 概念 NeRF(Neural Radiance Fields,神经辐射场)是一种用于3D场景重建和图像渲染的深度学习方法。它由Ben Mildenhall等人在2020年的论文《NeRF: Representing Scenes as Neur…

6个免费的3D模型网站,助你3D建模渲染不用愁

​随着3D建模和渲染技术的不断发展,其重要性也日益增加。创建新的3D模型往往需要耗费大量时间,因此,本文整理了六个顶尖的免费3D模型资源网站,以便您能够方便地获取3D模型,大幅减少建模时间。这些资源有助于您更快地开…

Redis持久化和集群

redis持久化 RDB方式 Redis Database Backup file (redis数据备份文件), 也被叫做redis数据快照. 简单来说就是把内存中的所有数据记录到磁盘中. 快照文件称为RDB文件, 默认是保存在当前运行目录. [rootcentos-zyw ~]# docker exec -it redis redis-cli 127.0.0.1:6379> sav…

Visual Studio 2022之Release版本程序发送到其它计算机运行

目录 1、缺少dll​ 2、应用程序无法正常启动 3、This application failed to start because no Qt platform plugin could be initialized. 代码在Debug模式下正常运行,然后切换到Release模式下,也正常运行,把第三方平台的dll拷贝到exe所在…

现货大宗电子盘交易软件的核心功能代码

现货大宗电子盘交易软件的核心功能代码是高度复杂且专有的,通常涉及多个模块和组件,包括但不限于用户认证、交易撮合、订单管理、风险管理、市场数据展示等。由于这些系统通常是由专业的金融科技公司或软件开发商根据特定的业务需求和技术标准定制开发的…

在unity中生成一个随机数

1.首先建立一个画布和空对象 2.创建脚本并将代码复制进去 using System.Collections; using System.Collections.Generic; using TMPro; using UnityEngine; public class suijishu : MonoBehaviour {public TextMeshProUGUI sjs;void Update(){if (Input.GetKeyDown(KeyCode.…

污水处理远程监控管理平台

随着城市化进程的加速和工业化的快速发展,污水处理成为了环境保护和可持续发展的重要环节。传统的污水处理监控方式往往依赖于现场巡查和人工记录,这种方式不仅效率低下,而且容易出现监控盲区,难以实现对污水处理过程的全面、实时…

Web框架开发-Django的视图层

一、视图函数 一个视图函数,简称视图,是一个简单的Python 函数,它接受Web请求并且返回Web响应。响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片. . . 是任何东西都可以。无论视图本身包含什么逻辑,都要返回响应。代码写在哪里也无所谓…