MySQL 索引详解

一、什么是索引

索引是数据库中一种特殊的数据结构,它类似于现实生活中图书馆的图书目录系统。在图书馆中,如果没有目录,我们想要找一本书可能需要一本一本地翻找,这无疑会耗费大量的时间和精力。而有了目录,我们可以通过书名、作者、主题等多种方式快速定位到想要的书。同样地,在数据库中,索引为表中的数据提供了快速访问的途径。它以一种有序的结构存储了数据表中某些列的值,并且每个值都指向了对应的数据行,这样当我们需要查找数据时,就可以通过索引来快速定位,而不需要扫描整个表。

举个例子,假设我们有一个包含数百万条记录的用户表,其中有一列是用户的登录名。如果没有索引,当我们想要查找某个特定用户的信息时,数据库系统可能需要逐行扫描整个表,这会耗费大量的时间。但如果我们在登录名列上建立了索引,数据库就可以利用这个索引快速地定位到该用户所在的行,就像在图书馆中通过目录快速找到一本书一样。

二、索引的分类

1. 普通索引

普通索引是最基本的索引类型,它允许在表的任意列上创建。它可以提高列的检索速度,但不具有唯一性约束。例如,在一个学生信息表中,我们可以在“姓名”列上创建普通索引,这样在查询特定学生的信息时就可以利用索引快速定位。创建普通索引的语法为:

CREATE INDEX index_name ON table_name (column_name);

2. 唯一索引

唯一索引与普通索引类似,但它要求索引列中的值必须是唯一的,即不允许有重复的值。这在需要确保某一列数据唯一性的情况下非常有用,比如用户的登录名、身份证号码等。创建唯一索引的语法为:

CREATE UNIQUE INDEX index_name ON table_name (column_name);

3. 组合索引

组合索引包含多个列的索引,适用于查询条件中涉及多个列的组合查询。在创建组合索引时,需要注意列的顺序,因为索引的左前缀特性决定了只有查询条件中使用了组合索引的左前缀列时,才能利用该索引。例如,创建一个组合索引 (column1, column2),那么在查询条件中使用 column1 或 column1 和 column2 的组合时都可以利用该索引,但如果只使用 column2 则无法利用该索引。

4. 主键索引

主键索引是一种特殊的唯一索引,它要求索引列的值唯一且不能为空。每个表只能有一个主键索引,通常在创建表时指定。主键索引不仅用于快速查询,还用于维护数据的完整性。创建主键索引的语法为:

CREATE TABLE table_name (column1 datatype PRIMARY KEY,column2 datatype,...
);

或者在已有表上添加主键索引:

ALTER TABLE table_name ADD PRIMARY KEY (column_name);

5. 聚簇索引与非聚簇索引

  • 聚簇索引:在 InnoDB 存储引擎中,聚簇索引的叶子节点存储了完整的数据行。每个表只能有一个聚簇索引,通常主键索引就是聚簇索引。如果没有定义主键,InnoDB 会尝试使用第一个唯一且非空的索引作为聚簇索引。如果这些都没有,InnoDB 会自动生成一个隐藏的聚簇索引。

  • 非聚簇索引:也称为二级索引或辅助索引,其叶子节点存储的是主键值而不是完整的数据行。当通过非聚簇索引查找数据时,需要先找到主键值,然后再通过主键索引找到实际的数据行。

各类索引比较表

索引类型特点描述适用场景示例
普通索引基本索引,无唯一性约束,可提高列检索速度经常用于查询条件中的列在学生表的“姓名”列上创建普通索引,用于快速查找学生信息
唯一索引索引列的值必须唯一,允许 NULL 值需要确保某一列数据唯一性的场景,如登录名、身份证号码等在用户表的“登录名”列上创建唯一索引,确保每个用户的登录名唯一
组合索引包含多个列的索引,适用于多列组合查询,需注意列顺序查询条件中涉及多个列的组合查询在用户表的“年龄”和“性别”列上创建组合索引,用于快速查询特定年龄和性别的用户组合
主键索引特殊的唯一索引,要求值唯一且不能为空,每个表只能有一个主键索引作为表的唯一标识,用于关联查询和维护数据完整性在用户表的“用户 ID”列上设置为主键索引,作为用户的唯一标识
聚簇索引叶子节点存储完整数据行,InnoDB 的主键索引通常为聚簇索引InnoDB 存储引擎中,用于快速通过主键访问数据InnoDB 表的主键索引,默认为聚簇索引
非聚簇索引叶子节点存储主键值,需通过主键再查找实际数据行,也称为二级索引或辅助索引当需要通过非主键列进行查询时,先找到主键值再定位数据行在 InnoDB 表的非主键列上创建非聚簇索引,用于提高这些列的查询效率

三、索引的劣势

虽然索引可以提高查询效率,但它也存在一些劣势:

  • 增加存储空间:索引本身需要占用一定的存储空间,这会增加数据库的存储开销。尤其是当表中有多个索引时,存储空间的占用会更加明显。

  • 影响数据更新速度:当对表中的数据进行插入、更新或删除操作时,数据库系统不仅要更新数据本身,还需要同时更新相关的索引。这会增加数据更新的开销,导致数据更新操作变慢。

  • 索引维护成本:索引的创建和维护需要一定的成本,包括时间成本和计算资源成本。在数据库设计和优化过程中,需要合理地选择和管理索引,以避免不必要的索引带来的维护负担。

四、什么时候需要创建索引

在以下情况下,通常需要考虑创建索引:

  • 频繁查询的列:如果某一列经常出现在查询条件中(如 WHERE 子句),则在该列上创建索引可以显著提高查询速度。例如,用户表中的登录名列,经常用于登录验证,因此需要创建索引。

  • 连接操作的列:在涉及多个表的连接查询中,如果连接条件中的列没有索引,连接操作可能会变得非常缓慢。因此,在连接列上创建索引可以提高连接查询的效率。

  • 排序和分组的列:当查询中包含排序(ORDER BY)或分组(GROUP BY)操作时,如果这些操作所涉及的列上有索引,数据库可以利用索引的有序性来快速完成排序和分组,从而提高查询性能。

  • 范围查询的列:对于经常进行范围查询的列,如日期列、数值范围列等,创建索引可以加速范围查询的执行。

五、哪些情况不要创建索引

在以下情况下,通常不建议创建索引:

  • 数据更新频繁的列:如果某一列的数据更新非常频繁,如每秒都会进行多次更新操作,那么在该列上创建索引会导致大量的索引维护开销,从而影响数据库的整体性能。

  • 低选择性的列:低选择性列是指该列中包含的值重复较多,区分度较低的列。例如,一个性别列只有“男”和“女”两个值,这样的列选择性较低,创建索引的意义不大,因为数据库在执行查询时可能不会使用该索引。

  • 小表:对于数据量较小的表,即使没有索引,查询操作的速度也可能很快,因为全表扫描的开销相对较小。在这种情况下,创建索引可能并不会带来明显的性能提升,反而会增加存储空间和数据更新的开销。

  • 频繁进行大规模数据删除或 truncating 的表:如果一个表经常需要进行大规模的数据删除或 truncating 操作,那么在该表上创建索引可能会导致索引的频繁重建和维护,增加不必要的开销。

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

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

相关文章

自动化框架的设计与实现

一、自动化测试框架 在大部分测试人员眼中只要沾上“框架”,就感觉非常神秘,非常遥远。大家之所以觉得复杂,是因为落地运用起来很复杂;每个公司,每个业务及产品线的业务流程都不一样,所以就导致了“自动化…

如何防止用户大量使用同一用户名恶意攻击

如何防止用户大量使用同一用户名恶意攻击? 在数据库层兜底 使用redisson分布式锁 当用户第一次在毫秒级别使用大量的请求去注册 由于布隆过滤器中还没没有缓存这些数据 大量请求打在数据库上可能会造成数据库宕机 因此可以使用reddison分布式锁来保证只有一个…

超详细docker部署搭建私有仓库harbor

一、安装docker 确保你的服务器上已经安装了 Docker 如果没有安装,按以下方法安装 yum install -y yum-utils yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo yum install docker-ce docker-ce-cli containerd.io 启动d…

541. 反转字符串 II

541. 反转字符串 IIhttps://leetcode.cn/problems/reverse-string-ii/ 给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。 如果剩余字符少于 k 个,则将剩余字符全部反转。…

力扣HOT100之普通数组:53. 最大子数组和

这道题目我用贪心做的,感觉用贪心的思路比较简单,以后要是面试碰到这道题就直接用贪心好了,这道题用贪心的核心思想就是不断将数组元素i加入总和sum,如果sum比当前维护的最大值result更大,说明当前遍历到的i是正数&…

muduo库的思路梳理

前言 对于muduo库源码的剖析我发现还是有些混乱的,所以这里再次梳理一下muduo网络库争取可以简单明了 首先对于muduo库来说,不能想的得太过于复杂,它无非就是一个线程池加上epoll组成的网络库 这里我们从用的角度出发理解muoduo网络库 #inc…

【C语言系列】数据在内存中存储

数据在内存中存储 一、整数在内存中的存储二、大小端字节序和字节序判断2.1什么是大小端?2.2练习2.2.1练习12.2.2练习22.2.3练习32.2.4练习42.2.5练习52.2.6练习6 三、浮点数在内存中的存储3.1练习3.2浮点数的存储3.2.1 浮点数存的过程3.2.2 浮点数取的过程 3.3题目…

C++学习之网盘项目单例模式

目录 1.知识点概述 2.单例介绍 3.单例饿汉模式 4.饿汉模式四个版本 5.单例类的使用 6.关于token的作用和存储 7.样式表使用方法 8.qss文件中选择器介绍 9.qss文件样式讲解和测试 10.qss美化登录界面补充 11.QHTTPMULTIPART类的使用 12.文件上传协议 13.文件上传协议…

多模态自动驾驶混合渲染HRMAD:将NeRF和3DGS进行感知验证和端到端AD测试

基于3DGS和NeRF的三维重建技术在过去的一年中取得了快速的进步,动态模型也变得越来越普遍,然而这些模型仅限于处理原始轨迹域内的对象。 HRMAD作为一种混合方案,将传统的基于网格的动态三维神经重建和物理渲染优势结合,支持在任意…

质检LIMS系统在食品生产加工企业的应用 如何保证食品生产企业的安全

在食品生产加工领域,质量安全是贯穿全产业链的生命线。随着《食品安全法》对全过程追溯要求的深化,传统实验室管理模式已难以满足高效、精准的质量管控需求。质检实验室信息管理系统(LIMS)作为数字化升级的核心工具,正…

树莓派超全系列文档--(8)RaspberryOS实用程序

RaspberryOS实用程序 实用程序kmsprintvclogvcgencmdvcosversionget_throttledmeasure_tempmeasure_clock [clock]measure_volts [block]otp_dumpget_config [configuration item|int|str]get_mem typecodec_enabled [type]mem_oommem_reloc_statsread_ring_osc 文章来源&#…

解锁DeepSeek潜能:Docker+Ollama打造本地大模型部署新范式

🐇明明跟你说过:个人主页 🏅个人专栏:《深度探秘:AI界的007》 🏅 🔖行路有良友,便是天堂🔖 目录 一、引言 1、什么是Docker 2、什么是Ollama 二、准备工作 1、操…

文件上传绕过的小点总结(6)

14.文件上传(文件包含漏洞)二次渲染 很多服务器为了防止代码嵌入图片,通常会将上传的图片进行重新生成处理,包括文件格式转换等等,嵌入的恶意代码很容易被改掉。于是产生了二次渲染,二次渲染的原理就是找到…

x-cmd install | Wuzz - Web 开发与安全测试利器,交互式 HTTP 工具

目录 安装配置快捷键上下文相关搜索待办事项 在 Web 开发和安全测试中,我们经常需要检查和修改 HTTP 请求。浏览器自带的开发者工具虽然好用,但复制出来的 cURL 命令冗长且难以编辑。今天要介绍的是 Wuzz,一款交互式命令行 HTTP 工具&#xf…

python --face_recognition(人脸识别,检测,特征提取,绘制鼻子,眼睛,嘴巴,眉毛)/活体检测

dlib 安装方法 之前博文 https://blog.csdn.net/weixin_44634704/article/details/141332644 环境: python3.8 opencv-python4.11.0.86 face_recognition1.3.0 dlib19.24.6人脸检测 import cv2 import face_recognition# 读取人脸图片 img cv2.imread(r"C:\Users\123\…

搭建k8s集群的可观测体系(log和metric)(已踩完坑)

Loki是日志聚合系统,属于云原生技术,由Grafana Labs开发。它专注于轻量级和高效的日志管理,特别是适合Kubernetes环境。而Prometheus-operator则是用来管理Prometheus监控系统的,简化部署和配置,处理监控数据,尤其是指标(metrics)的收集和告警。 本片文档踩坑结束,使用…

Mybatis配置文件解析(详细)

引言 在了解Mybatis如何帮助客户进行数据的存取后,便对Mybatis的配置文件起了兴趣,在查阅官方文档后,总结了平时能用到的配置,希望能对大家有帮助 1.核心配置文件 主要是指Mybatis-config.xml中 其包含了会深深影响Mybatis行为…

技术迭代、流量困境与营销突破:基于开源AI大模型与S2B2C模式的创新路径研究

摘要:在技术指数级迭代与流量红利消退的双重背景下,营销领域面临边际效应递减与竞争升级的双重挑战。本文基于"开源AI大模型""AI智能名片""S2B2C商城""小程序源码"等创新工具,探讨营销范式转型的路径…

针对stm32F103C8t6芯片调节USB串口的经验

1、首先这是自己手搓的板子,对于之前一直没有了解过USB这方面,则这个针对USB部分没有设计上拉电阻,造成不管怎么调节PC端都没有反应。 图一 这个没有添加1.5K电阻 这个D+位置应该再接一个1.5KR的电阻如图2所示 图2 这样调节的话PC端就可以识别到USB串口,但是这是串口还是会…

数据库和安装配置MySQL笔记(2)

1. 什么是数据库? 数据库(Database)是按照数据结构来组织、存储和管理数据的仓库。它通过系统化的方法,帮助用户高效地存储、检索和管理数据。 2. 常见数据库类型 关系型数据库(如 MySQL、PostgreSQL、Oracle&#…