数据库(MySQL)—— 索引

news2024/11/20 20:41:27

数据库(MySQL)—— 索引

  • 什么是索引
  • 创建索引
      • 使用 `CREATE INDEX` 语句
      • 使用 `ALTER TABLE` 语句
      • 在创建表时定义索引
      • 特殊类型索引
      • 注意事项
  • 举个例子
  • 无索引的情况
  • 有索引的情况
  • 为什么索引快
  • 索引的结构

今天我们来看看MySQL中的索引

什么是索引

MySQL中的索引是一种数据结构,主要用于提高数据库查询效率。它类似于书籍的目录,让你能够快速找到所需内容而无需逐页浏览整本书。在数据库中,索引使得MySQL能够快速定位到表中特定数据行的位置,从而加速数据检索过程。

以下是关于MySQL索引的一些关键点:

  1. 数据结构:最常见的索引类型是B-Tree索引,它利用了平衡树的数据结构,保持数据排序,便于执行范围查询和排序操作。此外,还有哈希索引、全文索引等其他类型,分别适用于不同的查询需求。
  2. 存储位置:索引存储在数据库表的一个独立的结构中,不与实际数据混在一起。对于InnoDB存储引擎,聚簇索引(Clustered Index)会直接存储数据在叶子节点,而非聚簇索引(Secondary Index)则存储指向聚簇索引的指针。
  3. 提高查询速度:当执行查询时,数据库系统首先查看索引,直接定位到数据行,而不是遍历整个表,显著减少了查询时间,特别是在处理大数据量时。
  4. 索引选择:不是所有列都适合创建索引,一般在以下情况考虑创建索引:频繁作为查询条件的列、经常需要排序或分组的列、用于连接操作的列。但同时要注意,索引也会占用存储空间,并可能降低写入(插入、更新、删除)操作的性能,因为每次数据变更都需要同步更新索引。
  5. 复合索引:当一个索引包含多个列时,称为复合索引或多列索引。在复合索引中,最左侧原则是一个重要概念,即查询条件从索引的最左列开始进行匹配。但在MySQL 5.6及以上版本引入了索引下推功能,可以在一定程度上放宽这一限制。
  6. 管理索引:可以通过CREATE INDEX语句创建索引,使用ALTER TABLE语句添加或删除索引,以及使用DROP INDEX语句来删除索引。

综上所述,MySQL索引是优化数据库性能的关键工具,合理设计和使用索引对于提升应用的响应速度至关重要。

创建索引

在MySQL中,创建索引可以通过几种方式来实现,具体取决于你的需求和所使用的SQL语句。下面是几种常见的创建索引的方法:

使用 CREATE INDEX 语句

这是创建索引的最基本方式,适用于已存在的表。基本语法如下:

CREATE INDEX index_name ON table_name(column_name(length));
  • index_name 是你给索引指定的名字。
  • table_name 是你要在其上创建索引的表的名称。
  • column_name 是你想要索引的列名,可选的 (length) 指定索引的长度,仅对字符串类型列有效,可以减少索引大小但可能影响前缀匹配查询。

示例:

CREATE INDEX idx_lastname ON employees(lastname);

使用 ALTER TABLE 语句

如果你在创建表后想添加索引,也可以使用 ALTER TABLE 语句:

ALTER TABLE table_name ADD INDEX index_name(column_name);

或者,如果想创建唯一索引(不允许重复值):

ALTER TABLE table_name ADD UNIQUE INDEX index_name(column_name);

示例:

ALTER TABLE students ADD INDEX idx_email ON(email);

在创建表时定义索引

你也可以在创建表的同时定义索引:

CREATE TABLE table_name (
    column1 datatype,
    column2 datatype,
    ...
    INDEX index_name(column_name),
    UNIQUE INDEX unique_index_name(column_name)
);

特殊类型索引

  • 全文索引:适用于全文本搜索。
CREATE FULLTEXT INDEX ft_index ON articles(content);
  • 空间索引:用于地理空间数据类型。
CREATE SPATIAL INDEX sp_index ON places(location);

注意事项

  • 在创建索引之前,应评估索引对查询性能的提升以及对数据插入、更新和删除操作的影响。
  • 避免对经常更新的列创建过多索引,因为这会增加维护索引的成本。
  • 使用 EXPLAIN 语句分析查询计划,以帮助决定最佳的索引策略。
  • 根据实际情况选择合适的索引类型,比如是否需要唯一索引、全文索引等。

通过上述方法,你可以根据数据库的具体需求灵活地创建不同类型的索引。

举个例子

我们创建一张表:

-- 学生表
CREATE TABLE stu(
    id int COMMENT '学生id',
    name varchar(10) COMMENT '姓名',
    tele_number varchar(11) COMMENT '电话号码'
)COMMENT '学生表';

我们插入一些数据:

-- 插入第一条学生记录
INSERT INTO stu (id, name, tele_number)
VALUES (1, '张三', '13800138000');

-- 插入第二条学生记录
INSERT INTO stu (id, name, tele_number)
VALUES (2, '李四', '13912345678');

-- 插入第三条学生记录
INSERT INTO stu (id, name, tele_number)
VALUES (3, '王五', '13777777777');

-- 插入第四条学生记录
INSERT INTO stu (id, name, tele_number)
VALUES (4, '赵六', '13600000000');

-- 插入第五条学生记录
INSERT INTO stu (id, name, tele_number)
VALUES (5, '陈七', '13555555555');

-- 插入第六条学生记录
INSERT INTO stu (id, name, tele_number)
VALUES (6, '周八', '13411111111');

-- 插入第七条学生记录
INSERT INTO stu (id, name, tele_number)
VALUES (7, '吴九', '13322222222');

-- 插入第八条学生记录
INSERT INTO stu (id, name, tele_number)
VALUES (8, '郑十', '13233333333');

-- 插入第九条学生记录
INSERT INTO stu (id, name, tele_number)
VALUES (9, '钱十一', '13144444444');

-- 插入第十条学生记录
INSERT INTO stu (id, name, tele_number)
VALUES (10, '孙十二', '13055555555');

在这里插入图片描述

无索引的情况

我们执行下面的语句:

SET profiling = 1; -- 开启查询性能分析(MySQL特有)
SELECT SQL_NO_CACHE * FROM stu WHERE tele_number = '13800138000';
SHOW PROFILES; -- 显示最近的查询性能分析结果

找到下面的这条:
在这里插入图片描述
前面的时间就是执行查询语句的时间,我们看到时间是0.00022875秒。

当然,如果我们重复执行,每一次的时间都不一样,这个很正常。
在这里插入图片描述这次是0.00023775。

有索引的情况

我们对stu的tele_num创建索引:

CREATE INDEX idx_tele_number ON stu(tele_number);

然后,再执行上面的三句话:

SET profiling = 1; -- 开启查询性能分析(MySQL特有)
SELECT SQL_NO_CACHE * FROM stu WHERE tele_number = '13800138000';
SHOW PROFILES; -- 显示最近的查询性能分析结果

在这里插入图片描述
时间是0.000222,唉,时间好像没有节省很多哎。这里我们的数据比较少,看不出什么区别,如果数据量一旦很大,就可以看出索引的厉害了。

其实,索引的本质就是空间换时间,索引本身会占空间,但是通过索引我们可以提高检索速度。

为什么索引快

索引之所以快,是因为索引创建之后,数据的排序结构发生了变化(变成了索引结构)

如果没有索引,MySQL会进行全表查找:

在这里插入图片描述在无索引情况下,就需要从第一行开始扫描,一直扫描到最后一行,我们称之为 全表扫描,性能很低。

但是如果我们创建了索引,数据的排序结构就发生变化,比如变成二叉树:
在这里插入图片描述
此时我们在进行查询时,极大的提高的查询的效率。

索引的结构

索引的底层结构会有这几种:

索引类型结构描述
B+Tree索引最常见的索引类型,适用于大多数数据库引擎,如InnoDB。它通过层级的树状结构存储数据,每个节点可以包含多个键值对以及指向子节点的指针。叶子节点包含了实际的数据记录或数据记录的指针,并且叶子节点间通过指针相连,形成了一个有序链表,这有助于范围查询和排序操作。
Hash索引底层基于哈希表实现,适用于等值查询,特别是键值唯一或高度重复的情况。哈希索引通过计算索引列的哈希值并直接定位到对应的值或行,查询速度快。但由于哈希冲突的存在,它不支持范围查询,也无法用于排序或最左前缀匹配。
R-tree索引(空间索引)一种特殊类型的索引,主要由MyISAM引擎支持,用于高效地存储和查询多维空间数据,如地理坐标。R-tree通过将多维空间划分为重叠的区域来组织数据,使得空间查询(如“附近的所有地点”)变得高效。
Full-text索引(全文索引)专为文本内容设计的索引,能够支持复杂的文本搜索,包括词根搜索、同义词匹配等。它通过构建倒排索引来实现,即索引项是单词,而值是一系列包含该单词的文档位置。这种索引适用于大文本字段的模糊查询和全文搜索,常见于博客、文档数据库等应用场景。

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

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

相关文章

0509_IO4

练习1&#xff1a; 创建一对父子进程&#xff1a; 父进程负责向文件中写入 长方形的长和宽 子进程负责读取文件中的长宽信息后&#xff0c;计算长方形的面积 1 #include <stdio.h>2 #include <string.h>3 #include <stdlib.h>4 #include <sys/types.h>…

PyCharm安装详细教程

PyCharm安装详细教程 PyCharm简介及其下载网站 PyCharm是由JetBrains打造的一款Python IDE(Integrated Development Environment&#xff0c;集成开发环境)&#xff0c;带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具。PyCharm提供了代码编辑、调试、语法高亮…

【BUUCTF】[RoarCTF 2019]Easy Java1

工具&#xff1a;hackbar发包&#xff0c;bp抓包。 解题步骤&#xff1a;【该网站有时候send不了数据&#xff0c;只能销毁靶机重试】 这里的登录界面是个天坑【迷魂弹】 直接点击help&#xff0c;然后进行打开hackbar——通过post请求&#xff0c;再通过bp抓包&#xff0c;…

DetCLIPv3:面向多功能生成开放词汇的目标检测

DetCLIPv3:面向多功能生成开放词汇的目标检测 摘要IntroductionRelated worksMethod DetCLIPv3: Towards Versatile Generative Open-vocabulary Object Detection 摘要 现有的开词汇目标检测器通常需要用户预设一组类别&#xff0c;这大大限制了它们的应用场景。在本文中&…

长难句打卡5.9

For example, the Long Now Foundation has as its flagship project a mechanical clock that is designed to still be marking time thousands of years hence. 例如,今日永存资金会将机械钟表视为旗舰项目,因此该钟表旨在为未来几千年保持计时。 Foundation n.基金会flag…

如何快速注册企业邮箱?只需要三步

快速注册一个企业邮箱&#xff0c;只需要以下三个步骤&#xff1a;一是挑选适合的邮箱版本和邮箱价格&#xff0c;二是填写必要的企业信息&#xff0c;三是完成企业邮箱的基础配置。完成上述三个步骤&#xff0c;企业就能够拥有一个专属的企业邮箱。 一、挑选适合的邮箱版本 …

jpg照片怎么压缩到10k?压缩照片并不难

jpg照片怎么压缩到10k&#xff1f;随着数字摄影的普及&#xff0c;我们手机或电脑中存储的照片数量越来越多&#xff0c;而这些高分辨率的照片往往会占用大量的存储空间。为了节省空间&#xff0c;将JPG照片压缩到较小的文件大小成为了许多人的需求。本文将为您介绍几款可以将J…

《基于GNU-Radio和USRP的雷达通信系统的实现》文献阅读

文章目录 前言一、摘要二、引言三、联合系统实施1、基本原理2、实验方案 四、软件设置1、发射机2、接收机 五、实验结果1、实验设置2、波形3、室内外对比4、不同参数的结果 六、结论七、参考文献八、论文自取九、阅读收获 前言 本文记录《基于GNU-Radio和USRP的雷达通信系统的实…

新手做抖音小店,应该怎么做才挣钱?按照这个思路来!

大家好&#xff0c;我是电商糖果 别人在抖音创业开店&#xff0c;都可以赚到钱&#xff0c;他们是怎么做到的。 作为一个新手&#xff0c;应该怎么做呢&#xff1f; 我相信这是很多人想开店的朋友&#xff0c;前期都会思考的问题。 下面糖果就来说一下&#xff0c;新手做抖…

vue 代码样式问题

部分电脑存在样式错乱问题&#xff0c;部分电脑样式正常。最后发现是样式写在 el-col 里面导致的。 注意&#xff1a;写样式不要放在 el-row 或者 el-row &#xff0c;导致部分电脑会出现莫名其妙的样式问题 <el-row class"detail"><el-col class"it…

达梦数据库限制用户登录IP测试

达梦数据库创建用户时可以限制登录ip和时间段。 创建测试测试用户 create user test1 identified by Test_1234 ALLOW_IP "192.168.100.101"; 限定该用户只能通过192.168.100.101地址登录数据库 连接测试 上图可见&#xff0c;192.168.100.101客户端可以连接上19…

研发妹子说如果问题不解决她就给我一口大黑锅:记Oracle库SQL执行超时导致业务无法测试优化处理记录

备注&#xff1a;本次记录根据后期回顾整理&#xff0c;实际测试过程遇到问题较多&#xff0c;也花费了不少时间&#xff0c;后期整理也有些处理过程被遗漏。 一、问题现象及处理过程 研发中心开发部一同事反馈某Oracle 测试库 10.xxx.xxx.xxx 无法访问&#xff0c;业务无法测…

振动分析的一些概念

一.时域分析 振动测试领域中&#xff0c;通常使用标准是ISO 10816系列标准&#xff0c;其要去使用有效值&#xff08;RMS&#xff09;来表示震动信号的能量大小&#xff0c;并提供一组限制值&#xff0c;以帮助用户评估机器的振动水平是否正常。 1.位移&#xff1a; 峰峰&…

STM32--LoRa通信模块

ATK-LORA-01_V3.0(V3.0 是版本号&#xff0c;型号是 ATK-LORA-01 &#xff0c;下面均以 ATK-LORA-01表示该产品) 是 ALIENTEK 推出的一款体积小、微功率、低功耗、高性能远距离 LORA 无线串口模块。模块设计是采用高效的 ISM 频段射频 SX1278 扩频芯片&#xff0c;模…

【Java SE】对象的比较

&#x1f970;&#x1f970;&#x1f970;来都来了&#xff0c;不妨点个关注叭&#xff01; &#x1f449;博客主页&#xff1a;欢迎各位大佬!&#x1f448; 本期内容满满干货&#xff0c;将会深入介绍对象与对象之间是如何进行比较的&#xff0c;我们知道基本数据类型是可以直…

Linux0.11中MINIX 文件系统

阅读linux 的源码的时候对minix 文件系统有很多的疑惑&#xff0c;根据自己的认识将这些做一个总结。 MINIX 文件系统由六个部分组成&#xff0c;分别是引导块&#xff0c;超级块&#xff0c;i结点位图&#xff0c;逻辑块位图&#xff0c;i结点&#xff0c;数据块。 引导块&am…

面试集中营—Redis架构篇

一、Redis到底是多线程还是单线程 1、redis6.0版本之前的单线程&#xff0c;是指网络请求I/O与数据的读写是由一个线程完成的&#xff1b; 2、redis6.0版本升级成了多线程&#xff0c;指的是在网络请求I/O阶段应用的多线程技术&#xff1b;而键值对的读写还是由单线程完成的。所…

每日Attention学习6——Context Aggregation Module

模块出处 [link] [code] [IJCAI 22] Boundary-Guided Camouflaged Object Detection 模块名称 Context Aggregation Module (CAM) 模块作用 增大感受野&#xff0c;全局特征提取 模块结构 模块代码 import torch import torch.nn as nn import torch.nn.functional as Fcla…

万兆以太网MAC设计(13)主机与FPGA之间进行PING

文章目录 前言&#xff1a;一、ICMP校验和计算二、上板效果1、终端命令行1、wireshark捕捉 前言&#xff1a; 在上板尝试进行PING操作的时候&#xff0c;发现一直是请求超时的情况&#xff0c;结果排查发现是首部校验和没有计算的问题。在UDP层&#xff0c;我们不进行校验和是…

【python】基于岭回归算法对学生成绩进行预测

前言 在数据分析和机器学习领域&#xff0c;回归分析是一种预测连续数值的监督学习技术。当数据特征与目标变量之间存在线性关系时&#xff0c;线性回归模型尤其有用。然而&#xff0c;当特征数量多于样本数量&#xff0c;或者特征之间存在多重共线性时&#xff0c;普通最小二…