SQL——索引

news2025/1/15 8:16:38

💡 索引

  在关系型数据库中,索引是一种单独的、物理上的对数据库表中的一列或多列的值进行排序的一种存储结构,他是某个表中的一列或着若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单(类似于图书目录,通过图书页码迅速找到所需内容)。一个索引是存储的表中一个特定列的值数据结构。索引是在表的列上创建。索引包含一个表中列的值,并且这些值存储在一个数据结构中。简单来说,不需要加内存,不用改程序,不用调SQL,查询速度就可以提高百倍千倍。

优点 :提高数据的检索速度,降低数据排序的成本。
缺点 :会降低更新表的速度。

举例说明:创建一张表,表中存了8000000条数据,这时查询数据的速度就会变慢。
在这里插入图片描述

SELECT * FROM emp WHERE ename='hPBmJv'

在这里插入图片描述
会发现数据检索的时间是4.591s,非常的慢。
在表的存放文件夹中可以看到,emp表现在的大小是655360KB
在这里插入图片描述
之后创建索引,再次查询

-- ename_index :索引名称
-- ON emp(ename) :表示在emp表的ename列创建索引
CREATE INDEX ename_index ON emp(ename);
-- 然后再次查询数据
SELECT * FROM `emp` WHERE ename='QZABhi'

在这里插入图片描述
  可以看到,检索速度明显变快,只用了0.034s就完成查询。但是相应的,我们再次查看emp表的.ibd文件,就会发现此时的文件大小为827392KB,可以得出创建索引,索引本身也会占用空间。
在这里插入图片描述
总结:在创建索引前,emp.ibd文件大小为655360KB,检索时间为4.591s;创建索引后,文件内存增加至827392KB,检索速度提升至0.034s。

常见的索引类型包括以下几种:

  1. 主键索引(Primary Key Index):主键索引是一种特殊的唯一索引,它默认为表的主键,即用来唯一标识每一行数据的索引。主键索引可以保证数据的唯一性,并且可以快速定位到指定的行。
  2. 唯一索引(Unique Index):唯一索引也是一种保证数据唯一性的索引,与主键索引不同的是,唯一索引可以定义多个,一个表中可以有多个唯一索引。唯一索引可以加速数据查找,并且可以帮助避免重复数据的插入。
  3. 普通索引(Normal Index):普通索引是最基本的索引类型,它可以加速数据的查找。对于非唯一值,普通索引可以在查找操作中提供一个快速的匹配过程。
  4. 全文索引(Fulltext Index):全文索引是用于大文本字段的索引类型,可以支持高速的文本搜索。

🎈 索引机制

💧索引的原理

没有索引为什么会慢?

  如果SQL查询语句没有合适的索引,那么它将执行全表扫描(full table scan),这种方式需要对整个表进行遍历,查找符合查询条件的数据,会产生以下几种性能问题:

  1. 大量的I/O操作:全表扫描会将整个表的数据读入内存,导致额外的 I/O 操作(包括磁盘读取、内存分配等),占用大量计算资源。
  2. 低效的查询速度:由于全表扫描需要遍历整个表,因此查询速度较慢,尤其是当表中数据量很大时。
  3. 阻塞其他操作:全表扫描的过程中,会占用大量的 CPU 和内存资源,从而影响数据库的性能,阻塞其他操作的执行。

  相比之下,使用索引能够降低查询的时间复杂度,快速定位到符合条件的数据,提高查询效率。因为索引可以直接跳过不满足查询条件的数据,只对符合条件的数据进行读取和处理,避免了无谓的数据读取和处理。此外,索引还可以减少 I/O 操作、缩短查询时间、提高数据库的并发能力。

使用索引为什么会快?

  SQL 索引是一种用于加速数据库查询操作的数据结构,它可以降低查询所需的时间复杂度,提高查询效率,从而优化数据库的性能。索引通常是通过 B-tree 或哈希表等数据结构来实现的。

  B-tree 索引是 SQL 中最常见的索引类型之一,它是一种基于平衡树(balanced tree)的数据结构,可以快速定位需要的数据。B-tree 索引在每个节点上存储一些关键字和指向下层子节点的指针,根据关键字的大小对节点进行排序,并将其分裂成较小的节点,从而保证平衡树的深度不会太大。

  当查询语句中包含索引列时,数据库会通过索引,快速地定位到相关数据的物理位置,然后进行数据的读取和处理。这种方式称为索引扫描(index scan),相比于全表扫描(table scan),可以大大减少查询所需的时间和资源。

  索引的选择是一个重要的问题。虽然索引可以加速查询操作,但过多的索引可能会降低数据库的性能,因为索引的维护也需要消耗计算和存储资源。一般来说,应该仅在必要的列上创建索引,优先考虑高频使用、复杂查询或者需要排序 / 分组的列,并且要注意避免对索引列进行计算或类型转换等操作,否则可能会导致索引失效。

  此外,当数据量较小时,索引对性能的提升可能并不显著;而当数据量很大或者查询条件较为复杂时,合理使用索引可以大大提高查询效率和性能。因此,在使用索引时需要根据具体情况进行权衡和调整,以达到最佳的性能优化效果。

💧索引的代价

虽然SQL索引可以提高查询性能和效率,但也会增加一些代价,主要包括以下几个方面:

  1. 空间代价:索引需要占用一定的磁盘空间,特别是当表中数据很大时,会消耗大量的存储空间。此外,在建立索引的过程中,需要对索引列进行排序和分组,也会增加额外的存储开销。
  2. 更新代价:当表中数据被修改时,索引也需要相应地进行维护和更新。这会耗费计算资源和时间,并且在大规模更新操作时,可能会导致锁定表的情况,影响数据库的并发性能。
  3. 查询代价:虽然索引可以提高查询效率,但是在某些情况下,索引查询可能比全表扫描更慢,尤其是当索引列不优化或者数据分布不均匀时。此时索引查询还需要读取索引文件、I/O 操作等,会增加一定的查询代价。
  4. 维护代价:当索引不再需要或者失效时,也需要对其进行删除或者清理操作。此操作也需要消耗一定的时间和资源,如果索引失效不及时清理,还可能产生额外的性能损失和异常情况。

  因此,在选择和使用索引时,需要根据数据库的实际情况和需求,综合考虑上述代价因素,做出合理的决策和管理调整,以实现优化查询性能的目标。

🎈索引使用

在使用索引前,先创建一张表测试,方便使用索引举例。

CREATE TABLE IF NOT EXISTS student(
	id INT,
	`name` VARCHAR(32)
);

💧查询索引

-- 查询表是否有索引,table_name是需要查询索引的表名。
-- 在sql中,可以使用 SHOW INDEX 或者 SHOW INDEXES 语句来查询表的索引信息
SHOW INDEX FROM table_name;
-- 例查询刚才创建的表的索引
SHOW INDEX FROM student;

在这里插入图片描述

💧创建索引

💍主键索引

在 SQL 中添加主键索引有两种方式:在表创建时添加主键索引,或者在表创建后通过 ALTER TABLE 语句添加主键索引。

  1. 在表创建时添加主键索引
CREATE TABLE table_name (
    column1 datatype PRIMARY KEY,
    column2 datatype,
    column3 datatype,   
);

在创建表时添加主键索引,需要在列名和数据类型之间加上 PRIMARY KEY 关键字,表示该列是主键,并且需要建立主键索引。

  1. 在表创建后添加主键索引
ALTER TABLE table_name ADD PRIMARY KEY (column1);

在表创建后添加主键索引,需要使用 ALTER TABLE 语句,使用 ADD PRIMARY KEY 子句来指定添加主键索引的列名。

需要注意的是,每个表只能有一个主键,所以无论是在表创建时还是在表创建后添加主键索引,都只能为一个列指定主键属性。

💍唯一索引

在 SQL 中添加唯一索引有两种方式:在表创建时添加唯一索引,或者在表创建后通过 ALTER TABLE 语句添加唯一索引。

  1. 在表创建时添加唯一索引
CREATE TABLE table_name (
    column1 datatype,
    column2 datatype,
    column3 datatype,
    UNIQUE (column1)
);

  在创建表时添加唯一索引,需要在列名和数据类型之后添加 UNIQUE 关键字,并指定需要建立唯一索引的列名。这样就可以为该列或多个列建立唯一索引。

  1. 在表创建后添加唯一索引
ALTER TABLE table_name ADD UNIQUE (column1);

在表创建后添加唯一索引,需要使用 ALTER TABLE 语句,使用 ADD UNIQUE 子句来指定添加唯一索引的列名。

需要注意的是,每个表可以有多个唯一索引,但每个唯一索引只能包含一个或多个列,且不能重复。

💍普通索引

在 SQL 中添加普通索引有两种方式:在表创建时添加普通索引,或者在表创建后通过CREATE INDEXALTER TABLE语句添加普通索引。

  1. 在表创建时添加普通索引
CREATE TABLE table_name (
    column1 datatype,
    column2 datatype,
    column3 datatype,
    INDEX index_name (column1)
);

在创建表时添加普通索引,需要使用 INDEX 关键字指定需要建立索引的列名,并指定索引名称。这样就可以为该列或多个列建立普通索引。

  1. 在表创建后添加普通索引
CREATE INDEX index_name ON table_name (column1);

或者

ALTER TABLE table_name ADD INDEX index_name (column1);

在表创建后添加普通索引,可以使用 CREATE INDEXALTER TABLE 语句。其中,CREATE INDEX 语句用于创建新的索引,而 ALTER TABLE 语句用于在现有表中添加索引。需要指定索引名称和需要建立索引的列名。

  需要注意的是,每个表可以有多个普通索引,但每个普通索引只能包含一个或多个列。普通索引可以在等值查询(如 = 和 IN 等操作)和范围查询(如 <、>、BETWEEN 等操作)时提高查询效率。

💍全文索引

  在 SQL 中添加全文索引需要先确保使用的数据库支持全文索引功能,如 MySQL、SQL Server 等,在此基础上可以通过以下步骤添加全文索引:

  1. 创建包含全文索引列的表
CREATE TABLE table_name (
    column1 datatype,
    column2 datatype,
    column3 datatype,
    FULLTEXT (column1, column2)
);

在创建表时指定需要包含全文索引的列,并使用 FULLTEXT 关键字表示这是一个全文索引列

  1. 添加全文索引
ALTER TABLE table_name ADD FULLTEXT (column1, column2);

在已有的表中添加全文索引,使用 ALTER TABLE 语句,并指定需要添加全文索引的列。

  1. 使用全文索引进行查询

  使用全文索引进行查询,需要使用 MATCH AGAINST 函数。该函数会根据关键词匹配全文索引列的内容,并返回匹配度得分,可以单独使用也可以与其他条件合并使用。

SELECT * FROM table_name WHERE MATCH (column1, column2) AGAINST ('search_keyword');

注意:全文索引通常只适用于大型文本数据,如文章、博客等。对于结构化数据(如数值、日期等),使用普通索引或主键索引会更有效率。同时,全文索引可能会占用较多的存储空间和内存资源,需要谨慎使用。

💧删除索引

💍主键索引

使用 ALTER TABLE 语句来删除表中的主键索引,具体步骤如下:

  1. 查看表中的主键约束名
SHOW INDEX FROM table_nmae;
-- 或者使用下面的语句
SHOW CREATE TABLE table_name;

在结果中找到主键的约束名,通常以 PRIMARY KEY 关键字开头,形如 PRIMARY KEY (column_name)。

  1. 删除主键索引
ALTER TABLE table_name DROP PRIMARY KEY;

其中 PRIMARY KEY 表示要删除的主键约束名,可以替换为实际的约束名。

  注意:删除主键索引会同时删除主键约束,如果该列还存在外键依赖,则无法删除主键索引。此外,删除主键索引会影响到已有数据的完整性,需要谨慎操作。因此,在删除主键索引之前,最好先备份数据并确认没有外键依赖。

💍唯一索引

使用 ALTER TABLE 语句来删除表中的唯一索引,具体步骤如下:

  1. 查看表中的唯一索引名

使用以下 SQL 语句查看表中的唯一索引名:

SHOW CREATE TABLE table_name;
-- 或者使用下面的语句
SHOW CREATE TABLE table_name;

在结果中找到需要删除的唯一索引,通常以 UNIQUE KEY 关键字开头,形如 UNIQUE KEY index_name (column_name)

  1. 删除唯一索引

使用以下 SQL 语句删除唯一索引:

ALTER TABLE table_name DROP INDEX index_name;

其中 index_name 表示需要删除的唯一索引名称,可以替换为实际的索引名称。

注意:删除唯一索引会影响到已有数据的完整性,需要谨慎操作。因此,在删除唯一索引之前,最好先备份数据并确认该列没有对应的外键依赖。

💍普通索引

你可以使用 ALTER TABLE 语句来删除表中的普通索引,具体步骤如下:

  1. 查看表中的普通索引名

使用以下 SQL 语句查看表中的普通索引名:

SHOW CREATE TABLE table_name;
-- 或者使用下面的语句
SHOW CREATE TABLE table_name;

在结果中找到需要删除的普通索引,通常以 KEY 关键字开头,形如 KEY index_name (column_name)

  1. 删除普通索引

使用以下 SQL 语句删除普通索引:

ALTER TABLE table_name DROP INDEX index_name;

其中 index_name 表示需要删除的普通索引名称,可以替换为实际的索引名称。

注意:删除普通索引会影响到查询性能,因此需要谨慎操作。在删除索引之前,最好先确认该索引没有被其他查询语句使用。

💍全文索引

使用 ALTER TABLE 语句来删除表中的全文索引,具体步骤如下:

  1. 查看表中的全文索引名

使用以下 SQL 语句查看表中的全文索引名:

SHOW CREATE TABLE table_name;

在结果中找到需要删除的全文索引,通常以 FULLTEXT KEY 关键字开头,形如 FULLTEXT KEY index_name (column_name)

  1. 删除全文索引

使用以下 SQL 语句删除全文索引:

ALTER TABLE table_name DROP INDEX index_name;

其中 index_name 表示需要删除的全文索引名称,可以替换为实际的索引名称。

注意:删除全文索引会影响到查询性能和搜索功能,因此需要谨慎操作。在删除索引之前,最好先确认该索引没有被其他查询语句或搜索功能使用。

🎈 创建索引规则

在 SQL 中,创建索引有以下几个规则:

  1. 索引只应该针对经常被查询的列创建,而不是所有列都要创建索引。

  2. 索引的名称应该具有描述性,以便于识别和维护,并且名称应该唯一。

  3. 索引应该基于选择性较高的列进行创建。选择性是指该列中包含的唯一值的数量与表中总记录数之比。选择性较高的列通常可以提供更好的搜索性能,因为它们可以过滤掉大量的记录。

  4. 如果多个列一起经常用于查询或排序,则应该将它们放在一个联合索引中,而不是各自创建单独的索引。这样可以提高这些列的查询效率。

  5. 如果某个列包含 NULL 值的百分比很高,那么就不应该为其创建索引,因为索引对 NULL 值的过滤效果很差。

  6. 如果表中的数据量很小,则可能没有必要为其创建索引,因为索引的建立和维护本身也会带来一定的开销。

  7. 对于频繁更新的表,过多的索引可能会增加更新时间和磁盘空间占用,因此需要谨慎创建索引。

总之,在创建索引时需要根据具体情况进行综合考虑,权衡索引的使用效果和成本,以达到优化查询性能的目的。

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

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

相关文章

RF技术设计的机械数码一体化防盗锁

机械数码一体化防盗锁在传统锁具的基础上增加了一个受控的弹子&#xff0c;只能通过设置过的合法钥匙开启&#xff0c;并且增加了防盗报警功能。本文介绍了基于PIC单片机、RF技术和无线数据传输技术的机械数码一体化防盗锁的设计。 引言 机械锁和数码锁是我们日常生活中最常见的…

CDGA|数据监管越来越严,数据治理发展何去何从?

尽管数据监管越来越严格&#xff0c;但仍然存在许多机会。事实上&#xff0c;数据监管的加强可能会促进金融科技行业更好地运用数据&#xff0c;激发金融科技行业更多的创新和合作,创造更多的价值和机会。 推动金融机构重视数据安全和隐私保护 促使他们采取更严格的安全措施&a…

Ueditor 富文本编辑器 插入 m3u8 和 mp4 视频(PHP)

当前环境&#xff1a;PHP、Ueditor的版本是1.4.3 新的需求是&#xff0c;需要在Ueditor 富文本编辑器中&#xff0c;插入视频播放&#xff0c;并且视频格式有MP4&#xff0c;也有M3U8。 百度编辑器默认的是embed&#xff0c;需要修改下配置。 ueditor.all.js和 ueditor.confi…

C++vector的动态扩容,为何是1.5倍或者是2倍

1. vector如何进行扩容 当插入元素时&#xff0c;如果size capacity&#xff0c;触发扩容机制。 拷贝元素释放旧空间 2. 如何避免扩容导致效率低 在插入前&#xff0c;预估好vector的容量&#xff0c;通常使用reserve。如果没有reserve&#xff0c;边插边扩容&#xff0c;…

ROS学习7:ROS机器人导航仿真

【Autolabor初级教程】ROS机器人入门 1. 概述 在 ROS 中机器人导航 (Navigation) 由多个功能包组合实现&#xff0c;ROS 中又称之为导航功能包集&#xff0c;关于导航模块&#xff0c;官方介绍如下 一个二维导航堆栈&#xff0c;它接收来自里程计、传感器流和目标姿态的信息&a…

汽车智能化「出海」红利

在高阶智能座舱中&#xff0c;车载导航产品作为与用户体验息息相关的模块之一&#xff0c;同样也进入了升级迭代周期。 基于高精度地图渲染、高精度定位算法、AR等技术的车道级导航、AR导航等产品快速上车&#xff0c;但同时随着人机交互多模发展以及3D沉浸式用户体验需求趋势下…

DataX-在Windows上实现postgresql同步数据到mysql

场景 DataX-阿里开源离线同步工具在Windows上实现Sqlserver到Mysql全量同步和增量同步: DataX-阿里开源离线同步工具在Windows上实现Sqlserver到Mysql全量同步和增量同步_霸道流氓气质的博客-CSDN博客 在上面实现sqlserver到mysql的数据同步之后&#xff0c;如果要实现postg…

FPGA/Verilog HDL/AC620零基础入门学习——8*8同步FIFO实验

实验要求 该项目主要实现一个深度为8、位宽为8bit的同步FIFO存储单元。模块功能应包括读控制、写控制、同时读写控制、FIFO满状态、FIFO空状态等逻辑部分。 该项目由一个功能模块和一个testbench组成。其中功能模块的端口信号如下表所示。 提示&#xff1a; &#xff08;1&a…

Sqoop 从入门到精通

Sqoop Sqoop 架构解析 概述 Sqoop是Hadoop和关系数据库服务器之间传送数据的一种工具。它是用来从关系数据库如&#xff1a;MySQL&#xff0c;Oracle到Hadoop的HDFS&#xff0c;并从Hadoop的文件系统导出数据到关系数据库。 传统的应用管理系统&#xff0c;也就是与关系型数…

【微服务笔记24】微服务组件之Sleuth + Zipkin实现服务调用链路追踪功能

这篇文章&#xff0c;主要介绍微服务组件之Sleuth Zipkin实现服务调用链路追踪功能。 目录 一、Sleuth链路追踪 1.1、什么是Sleuth 1.2、Sleuth专业术语 &#xff08;1&#xff09;Span &#xff08;2&#xff09;Trace &#xff08;3&#xff09;工作原理 1.3、Sleuth…

月薪15K必会技术,如何从0到1学习性能测试,5个操作安排的明明白白

目录 【开幕】武林秘籍惊现江湖 【第一幕】该不该预测一个初始值&#xff1f; 【第二幕】从单线程开始 【第三幕】用命令行形式跑性能测试&#xff0c;然后观察机器性能。 【第四幕】控制吞吐&#xff01;控制吞吐&#xff01;控制吞吐&#xff01; 【第五幕】武林秘籍重…

10 dubbo源码学习_线程池

1. 线程模型&线程池介绍1.1 线程池1.2 线程模型 2. 线程池源码分析2.1 FixedThreadPool2.2 CachedThreadPool2.3 LimitedThreadPool 3. 线程模型源码3.1 AllDispatcher3.2 DirectDispatcher3.3 MessageOnlyDispatcher3.4 ExecutionDispatcher3.5 ConnectionOrderedDispatch…

Visual Studio C# WinForm开发入门(6):TreeView 控件使用

TreeView控件用树显示节点层次。 例如&#xff1a;顶级目录是根(C:)&#xff0c;C盘下的每个子目录都是子节点&#xff0c;而每个子目录又都有自己的子节点 TreeView属性和方法&#xff1a; 属性说明CheckBoxes表示节点旁边是否出现复选框ImageList指定一个包含节点图标的Imag…

Spring Cloud Gateway 服务网关的部署与使用详细介绍

为什么需要服务网关 传统的单体架构中只需要开放一个服务给客户端调用&#xff0c;但是微服务架构中是将一个系统拆分成多个微服务&#xff0c;如果没有网关&#xff0c;客户端只能在本地记录每个微服务的调用地址&#xff0c;当需要调用的微服务数量很多时&#xff0c;它需要…

【音视频第20天】wireshark+tcpdump

tcpdump抓 wireshark分析 目录 tcpdumpwireshark tcpdump tcpdump参数详解 网上一搜一大堆。最全的不是用tcpdump -h而是man tcpdump来查询手册。 tcpdump -i eth0 -p udp -xx -Xs 0 -w /root/test2.cap -i 针对eth0网卡的&#xff0c;ifconfig是查看有几个网卡 -i eth0 表示…

海睿思分享 | 终于有人把指标体系和标签体系说清楚了

当前&#xff0c;随着企业数字化转型如火如荼地开展&#xff0c;在企业经营管理数字化的数据建设过程中&#xff0c;经常会遇到指标和标签的使用场景。 指标体系到底是什么&#xff1f;标签体系又是什么&#xff1f;这些疑问导致在数据分析过程中效率低下、科学性不高&#xf…

回首来路多感概,最是奋斗动人心。

我们必需要在不同的时代有不同的领悟&#xff0c;才能充满生机地去迎接生命中每个新的开始。 文章目录 前言 初心 成长 收获 憧憬 出发 前言 今天是我成为csdn创作者一周年纪念日&#xff0c;我非常开心能够和大家分享我的写作之旅。在这一年里&#xff0c;我经历了许多挑…

ChatGPT实现数据集模拟生成,ChatGPT实现密码生成

数据集模拟生成 之前章节我们已经演示过ChatGPT 如何根据 prompt 编写文章或续写文章&#xff0c;文本生成的作用不仅仅在语文方面有用&#xff0c;本节我们演示另一种场景&#xff0c;利用 ChatGPT 来生成数据。看似作用差不多&#xff0c;其实这是目前开源社区非常常用的大语…

低代码和零代码二子争夺,你扶谁上位?

传统的软件研发方式目前并不能很好地满足企业的需求&#xff1a;人员成本高、研发时间长、运维复杂。这时低代码或零代码工具的出现为快速开发软件提供了更好的思路。对于不太了解两者的人来说&#xff0c;零代码和低代码是什么&#xff1f;又有什么联系与区别&#xff1f; 什么…

手把手教你安装telnet(离线方式+在线方式)

系列文章目录 文章目录 系列文章目录前言一、telnet是什么&#xff1f;二、安装步骤总结 前言 一、telnet是什么&#xff1f; Telnet协议是TCP/IP协议族中的一员&#xff0c;是Internet远程登录服务的标准协议和主要方式。它为用户提供了在本地计算机上完成远程主机工作的能力…