当前位置: 首页 > news >正文

MySQL 索引类型

什么是索引?


索引是一种用于提高数据库查询性能的数据结构。它是在表中一个或多个列上创建的,可以加快对这些列的数据检索速度。

索引的作用是通过创建一个额外的数据结构,使得数据库可以更快地定位和访问数据。当执行查询语句时,数据库可以使用索引来快速定位满足查询条件的数据行,而不需要逐行扫描整个表。这样可以大大减少查询的时间和资源消耗。

以下是一些MySQL索引的作用:

  • 提高查询性能:索引可以加速数据检索操作,特别是对于大型表和复杂查询语句。通过使用索引,数据库可以快速定位到满足查询条件的数据行,减少了磁盘I/O和数据扫描的开销。
  • 加速排序和分组操作:当执行排序或分组操作时,索引可以帮助数据库避免对整个表进行排序或分组,而是直接使用索引的排序顺序或分组结果,提高了排序和分组的效率。
  • 支持唯一约束和主键约束:索引可以用于创建唯一约束和主键约束,确保表中的某个列或列组的值是唯一的。这样可以防止重复数据的插入,并提高数据的完整性和一致性。
  • 加速连接操作:当执行连接(JOIN)操作时,索引可以用于快速定位连接列的匹配值,从而加速连接操作的执行。

需要注意的是,虽然索引可以提高查询性能,但过多或不合理的索引也会带来一些负面影响。索引需要占用额外的存储空间,并在插入、更新和删除操作时增加了维护成本。因此,在设计索引时需要权衡查询性能和维护成本,并根据具体的查询需求和数据访问模式来选择适当的索引策略。

MySQL 常见索引类型

在MySQL中,主要的索引类型包括主键索引、唯一索引、B+Tree索引、哈希索引和全文索引。下面我将详细介绍每种索引类型的使用方法、使用场景和注意事项,并给出一些示例说明:

主键索引(Primary Key Index)

在MySQL中,主键索引是一种特殊的索引,用于唯一标识表中的每一行数据。

1)使用方法

  • 在创建表时指定主键:在创建表时,可以使用 PRIMARY KEY 关键字指定主键索引。例如:PRIMARY KEY (id)。
  • 后续添加主键:如果表已经创建,可以使用 ALTER TABLE 语句添加主键。例如:ALTER TABLE table_name ADD PRIMARY KEY (id)。

2)特点

  • 唯一性:主键索引的值必须是唯一的,不允许重复。
  • 非空性:主键索引的值不能为NULL,每个索引值都必须有一个有效的值。
  • 聚簇索引:在InnoDB存储引擎中,主键索引也是聚簇索引,即表数据的物理存储按照主键的顺序组织。

3)使用场景

  • 唯一标识行:主键索引用于唯一标识表中的每一行数据,确保每个索引值都是唯一的。
  • 快速查找:主键索引可以加速根据主键值进行精确查找的操作。
  • 关联表关系:主键索引常用于建立表之间的关联关系,作为外键的参照。

4)注意事项

  • 主键的选择:主键应该是独一无二的,并且在表中的每一行都有值。通常使用自增长的整数作为主键,例如使用 INT AUTO_INCREMENT。
  • 主键的不可更改性:主键值一旦被指定,通常情况下不应该更改。因为主键索引的顺序是有序的,更改主键值可能导致数据在索引中的位置变动,影响性能。
  • 主键索引的大小:主键索引的大小直接影响表的大小和查询性能。选择适当的主键长度可以减少索引的存储空间和提高查询效率。

以下是一个使用主键索引的示例:

// 方式一
CREATE TABLE user (id int(11) PRIMARY KEY AUTO_INCREMENT,name varchar(50) NOT NULL,email varchar(100) NOT NULL
) ;// 方式二
CREATE TABLE user (id int(11) NOT NULL AUTO_INCREMENT,name varchar(50) NOT NULL,email varchar(100) NOT NULL,PRIMARY KEY (id)
) ;

在上述示例中,id 列被指定为主键,使用了自增长的整数作为主键值。主键索引将确保 id 列的值在表中是唯一的,并且可以通过主键值快速查找和访问表中的数据行。

唯一索引(Unique Index)

在MySQL中,唯一索引是一种用于确保列或列组合中的值唯一性的索引。

1)使用方法

  • 在创建表时指定唯一索引:在创建表时,可以使用 UNIQUE 关键字将一个或多个列指定为唯一索引。
  • 后续添加唯一索引:如果表已经创建,可以使用 ALTER TABLE 语句添加唯一索引。例如:ALTER TABLE table_name ADD UNIQUE INDEX idx_email (email)。

2)特点

  • 唯一性:唯一索引要求索引列或列组合中的值是唯一的,不允许重复。
  • 可以包含多列:唯一索引可以包含一个或多个列,用于确保多列组合的唯一性。
  • 空值性:唯一索引可以为空。

3)使用场景

  • 确保数据的唯一性:唯一索引常用于确保某些列或列组合中的值是唯一的,例如用户的邮箱、身份证号等。
  • 加速查找操作:唯一索引可以加速根据唯一索引列进行精确查找的操作。
  • 避免重复插入:唯一索引可以防止重复数据的插入,保证数据的一致性。

4)注意事项

  • 唯一索引的选择:选择适当的列或列组合作为唯一索引,确保索引的唯一性要求。
  • 唯一索引的更新代价:插入、更新或删除唯一索引列的数据时,数据库需要检查唯一性约束,这可能会带来一定的性能开销。
  • 多列唯一索引的顺序:对于多列唯一索引,列的顺序也会影响索引的效果,需要根据实际情况选择合适的列顺序。

以下是一个使用唯一索引的示例:

// 方式一
CREATE TABLE user (id int(11) PRIMARY KEY AUTO_INCREMENT,email varchar(100) UNIQUE,username varchar(50) NOT NULL,
) ;// 方式二
CREATE TABLE user (id int(11) NOT NULL AUTO_INCREMENT,email varchar(100) NOT NULL,username varchar(50) NOT NULL,UNIQUE INDEX idx_email (email),PRIMARY KEY (`id`)
) ;

在上述示例中,email 列被指定为唯一索引,确保每个邮箱地址在表中是唯一的。唯一索引将防止重复的邮箱地址插入到 users 表中,并提供快速的查找能力。

B+Tree 索引

在 MySQL 中,B+ 树索引是一种常用的索引结构,用于提高查询效率。

1)使用方法

  • 创建 B+ 树索引:在创建表时,可以使用 CREATE INDEX 语句创建 B+ 树索引。例如:CREATE INDEX idx_name ON table_name (name)。

2)特点

  • 多层索引结构:B+ 树索引是一种多层平衡树结构,具有根节点、内部节点和叶子节点。叶子节点包含实际的索引数据。
  • 排序和范围查询:B+ 树索引可以按照索引的顺序进行排序,并且支持范围查询,例如大于、小于或介于某个值的查询。
  • 适应性:B+ 树索引适用于范围查询、排序和等值查询等多种查询场景。
  • 磁盘访问优化:B+ 树索引通过减少磁盘 I/O 次数来提高查询性能,因为它具有较低的树高度和更好的数据局部性。

3)使用场景

  • 高基数列:适用于具有高基数(不同值较多)的列,例如用户 ID、订单号等。
  • 范围查询:适用于需要按照某个范围进行查询的场景,例如按时间范围查询、按价格范围查询等。
  • 排序:适用于需要按照某个列进行排序的场景,例如按照姓名、日期等进行排序。

4)注意事项

  • 选择合适的列:选择合适的列作为 B+ 树索引可以提高查询性能。通常选择具有高基数和频繁查询的列作为索引列。
  • 索引更新的代价:B+ 树索引在插入、更新和删除数据时需要维护索引结构,可能会导致性能下降。因此,在选择索引时需要权衡查询性能和更新代价。

举例说明:假设有一个名为user的表,包含 id、name 和 email 列。我们可以为 email 列创建一个 B+ 树索引,以加速根据邮箱进行查询的操作:

CREATE INDEX idx_email ON user (email);

这将在 user 表的 email 列上创建一个 B+ 树索引。之后,我们可以使用类似以下的查询来利用该索引:

SELECT * FROM user WHERE email = 'example@example.com';

这将使用 B+ 树索引快速定位到具有指定邮箱的用户数据。

哈希索引

在MySQL中,哈希索引是一种特殊的索引类型,使用哈希函数将索引值转换为固定长度的哈希码,然后将哈希码与索引项关联。

1)使用方法

  • 创建哈希索引:在创建表时,可以使用 USING HASH 关键字指定哈希索引。
  • 后续添加哈希索引:创建表后,可以使用 CREATE INDEX 语句创建哈希索引。例如:CREATE INDEX idx_hash ON table_name (column_name) USING HASH。
  • 注意:哈希索引只能用于等值查询,不支持范围查询。

2)特点

  • 快速查询:哈希索引使用哈希函数将索引值转换为哈希码,可以快速定位到对应的索引项,适用于等值查询。
  • 哈希冲突:由于哈希函数的有限性,不同的索引值可能会映射到相同的哈希码,这就是哈希冲突。数据库引擎会使用解决冲突的方法,如链表或开放地址法。
  • 不支持排序:哈希索引不适用于排序操作,因为哈希码是根据索引值计算得到的,无法按照哈希码的顺序进行排序。
  • 适用于高基数列:哈希索引适用于具有高基数(不重复值较多)的列,可以减少哈希冲突的概率。

3)使用场景

  • 等值查询:哈希索引适用于等值查询,例如根据唯一标识进行查找操作。
  • 高基数列:当列中的不重复值较多时,哈希索引可以提供较好的查询性能。
  • 内存数据库:哈希索引在内存数据库中广泛使用,因为内存中的哈希查找速度非常快。

4)注意事项

  • 冲突处理:哈希索引可能会出现哈希冲突,需要数据库引擎进行冲突处理。较高的冲突率可能导致性能下降,因此需要选择合适的哈希函数和解决冲突的方法。
  • 不支持范围查询:哈希索引只适用于等值查询,不支持范围查询(例如大于、小于、区间查询)。
  • 内存消耗:哈希索引通常需要占用较多的内存空间,特别是对于大型表和高基数列。

以下是一个使用哈希索引的示例:

CREATE TABLE user (id int(11) NOT NULL,name varchar(50) NOT NULL,email varchar(100) NOT NULL,PRIMARY KEY (id),INDEX idx_hash_email (email) USING HASH
);

在上述示例中,email 列被创建为哈希索引,使用 USING HASH 指定索引类型为哈希索引。哈希索引可以加快根据 email 进行等值查询的速度。

全文索引

在MySQL中,全文索引是一种用于全文搜索的索引类型,它允许在文本字段中进行关键词搜索。

1)使用方法

  • 创建全文索引:在创建表时,可以使用 FULLTEXT 关键字将一个或多个文本字段指定为全文索引。例如:FULLTEXT INDEX idx_content (content)。

2)特点

  • 关键词搜索:全文索引允许在文本字段中进行关键词搜索,而不仅仅是精确匹配。
  • 倒排索引:全文索引使用倒排索引的数据结构,它记录了每个关键词出现在哪些文档中,以及在文档中的位置。
  • 自然语言处理:全文索引支持自然语言处理,可以进行词干化、停用词过滤等操作,提高搜索的准确性和效果。

3)使用场景

  • 文本搜索:全文索引适用于需要在大量文本数据中进行关键词搜索的场景,如博客文章、新闻内容、产品描述等。
  • 排名和排序:全文索引可以用于根据关键词匹配度对搜索结果进行排名和排序。
  • 高效查询:全文索引可以提供快速的文本搜索查询,避免了对大量数据进行全表扫描。

4)注意事项:

  • 支持的存储引擎:全文索引只支持使用InnoDB和MyISAM存储引擎的表。
  • 最小词长度:默认情况下,MySQL的全文索引会忽略长度小于4的词。可以通过修改 ft_min_word_len 参数来调整最小词长度。
  • 停用词过滤:全文索引默认会忽略一些常见的停用词(如"and"、"the"等),可以通过修改 ft_stopword_file 参数来指定自定义的停用词文件。

以下是一个使用全文索引的示例:

CREATE TABLE article (id int(11) PRIMARY KEY AUTO_INCREMENT,title varchar(100) NOT NULL,content text NOT NULL,FULLTEXT INDEX idx_content (content)
);

在上述示例中,content 列被指定为全文索引,可以使用 MATCH AGAINST 语句进行全文搜索查询。例如:

SELECT * FROM articles WHERE MATCH(content) AGAINST('keyword');

这将返回包含关键词 "keyword" 的文章列表。

这些是MySQL中常见的索引类型以及它们的使用方法、使用场景和注意事项。根据具体的需求和查询模式,选择合适的索引类型可以提高查询性能和数据完整性。

相关文章:

MySQL 索引类型

什么是索引? 索引是一种用于提高数据库查询性能的数据结构。它是在表中一个或多个列上创建的,可以加快对这些列的数据检索速度。 索引的作用是通过创建一个额外的数据结构,使得数据库可以更快地定位和访问数据。当执行查询语句时&#xff0c…...

哈希表——闭散列表

该哈希表实现是闭散列实现法。 闭散列表: 闭散列:也叫开放定址法,当发生哈希冲突时,如果哈希表未被装满,说明在哈希表中必然还有空位置,那么可以把key存放到冲突位置中的“下一个” 空位置中去。 那如何寻…...

【ArcGIS Pro微课1000例】0036:栅格影像裁剪与提取(矢量范围裁剪dem高程数据)

本实验讲解在ArcGIS Pro中进行栅格影像裁剪与提取(矢量范围裁剪dem高程数据)的方法。DEM、DOM、DSM等栅格数据方法也可以实现。 文章目录 一、加载实验数据二、裁剪工具的使用1. 裁剪栅格2. 按掩膜提取一、加载实验数据 加载配套实验数据包中的0036.rar中的dem数据和矢量裁剪…...

Doris-Routine Load(二十七)

例行导入(Routine Load)功能为用户提供了一种自动从指定数据源进行数据导入的功能。 适用场景 当前仅支持从 Kafka 系统进行例行导入,使用限制: (1)支持无认证的 Kafka 访问,以及通过 SSL 方…...

linux驱动.之 网络udp应用层测试工具demon(一)

绑定vlan&#xff0c;网卡的demon&#xff0c;如果有多个网卡&#xff0c;多个vlan&#xff0c;网卡的ip设置成一致&#xff0c;那就不能只简单绑定ip来创建socket&#xff0c; 需要绑定网卡设备 客户端udp_client.c #include <stdio.h> #include <string.h> #inc…...

【Flutter】graphic图表的快速上手

简介 graphic是一个数据可视化语法和Flutter图表库。 官方github示例 网上可用资源很少,只有作者的几篇文章,并且没有特别详细的文档,使用的话还是需要一定的时间去调研,在此简单记录。 示例 以折线图为例(因为我只用到了折线图,但其他的图大差不差) 创建一个两个文…...

DeepMind 推出 OPRO 技术,可用于优化 ChatGPT 提示

本心、输入输出、结果 文章目录 DeepMind 推出 OPRO 技术&#xff0c;可用于优化 ChatGPT 提示前言消息摘要OPRO的工作原理DeepMind的研究相关链接花有重开日&#xff0c;人无再少年实践是检验真理的唯一标准 DeepMind 推出 OPRO 技术&#xff0c;可用于优化 ChatGPT 提示 编辑…...

企业网络中的身份安全

随着近年来数字化转型的快速发展&#xff0c;企业使用的数字身份数量急剧增长。身份不再仅仅局限于用户。它们现在扩展到设备、应用程序、机器人、第三方供应商和组织中员工以外的其他实体。即使在用户之间&#xff0c;也存在不同类型的身份&#xff0c;例如属于IT管理员、远程…...

智能优化算法应用:基于正余弦算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于正余弦算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于正余弦算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.正余弦算法4.实验参数设定5.算法结果6.参考文献7.…...

创建一个带有背景图层和前景图层的渲染窗口

开发环境&#xff1a; Windows 11 家庭中文版Microsoft Visual Studio Community 2019VTK-9.3.0.rc0vtk-example demo解决问题&#xff1a; 创建一个带有背景图层和前景图层的渲染窗口&#xff0c;知识点&#xff1a;1. 画布转image&#xff1b;2. 渲染图层设置&#xff1b;3.…...

Docker 运行 Oracle Autonomous Database Free Container

​ Docker 运行 Oracle Autonomous Database Free Container Oracle Autonomous Database Free Container Image 介绍通过 Docker 运行 Oracle Autonomous Database Free ContainerWallet 配置可用的 TNS 别名MY_ATP TNS 别名MY_ADW TNS 别名连接到 Oracle Autonomous Databas…...

《2023全球隐私计算报告》正式发布!

2023全球隐私计算报告 1、2023全球隐私计算图谱2、国内外隐私计算相关政策3、隐私计算技术的最新发展4、隐私计算技术的合规挑战5、隐私计算的应用市场动态6、隐私计算开源整体趋势7、隐私计算的未来趋势 11月23日&#xff0c;由浙江省人民政府、商务部共同主办&#xff0c;杭州…...

JAVA sql 查询2

SELECT * FROM employees order by salayr DESC SELECT employee_id,first_name,salary from employees ORDER BY salary,employee_id desc -- 最大值 最小值 总和 平均值 SELECT max(salary),MIN(salary),sum(salary),AVG(salary) FROM employees -- 总共有多少员工 select…...

为第一个原生Spring5应用程序添加上Log4J日志框架!

&#x1f609;&#x1f609; 学习交流群&#xff1a; ✅✅1&#xff1a;这是孙哥suns给大家的福利&#xff01; ✨✨2&#xff1a;我们免费分享Netty、Dubbo、k8s、Mybatis、Spring...应用和源码级别的视频资料 &#x1f96d;&#x1f96d;3&#xff1a;QQ群&#xff1a;583783…...

单片机复位电路

有时候我们的代码会跑飞,这个时候基本上是一切推到重来.”推倒重来”在计算机术语上称为复位.复位需要硬件的支持,复位电路就是在单片机的复位管脚上产生一个信号&#xff0c;俗称复位信号.这个信号需要持续一定的时间,单片机收到该信号之后就会复位,从头执行。 复位原理: 那么…...

11.28 知识回顾(Web框架、路由控制、视图层)

一、 web 框架 1.1 web框架是什么&#xff1f; 别人帮咱们写了一些基础代码------》我们只需要在固定的位置写固定的代码--》就能实现一个web应用 Web框架&#xff08;Web framework&#xff09;是一种开发框架&#xff0c;用来支持动态网站、网络应用和网络服务的开发。这大多…...

osgFX扩展库-异性光照、贴图、卡通特效(1)

本章将简单介绍 osgFX扩展库及osgSim 扩展库。osgFX库用得比较多,osgSim库不常用&#xff0c;因此&#xff0c;这里只对这个库作简单的说明。 osgFX扩展库 osgFX是一个OpenSceneGraph 的附加库&#xff0c;是一个用于实现一致、完备、可重用的特殊效果的构架工具&#xff0c;其…...

SELinux零知识学习三十一、SELinux策略语言之角色和用户(2)

接前一篇文章:SELinux零知识学习三十、SELinux策略语言之角色和用户(1) 三、SELinux策略语言之角色和用户 SELinux提供了一种依赖于类型强制(类型增强,TE)的基于角色的访问控制(Role-Based Access Control),角色用于组域类型和限制域类型与用户之间的关系,SELinux中…...

Unity UGUI的自动布局-LayoutGroup(水平布局)组件

Horizontal Layout Group | Unity UI | 1.0.0 1. 什么是HorizontalLayoutGroup组件&#xff1f; HorizontalLayoutGroup是Unity UGUI中的一种布局组件&#xff0c;用于在水平方向上对子物体进行排列和布局。它可以根据一定的规则自动调整子物体的位置和大小&#xff0c;使它们…...

【SpringCloud】设计原则之分层架构与统一通信协议

一、设计原则之分层架构 应用分层看起来很简单&#xff0c;但每个程序员都有自己的一套方法&#xff0c;哪怕是初学者&#xff0c;所以实施起来并非易事 最早接触的分层架构应该是最熟悉的 MVC&#xff08;Model - View - Controller&#xff09;架构&#xff0c;其将应用分成…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 笔者写过很多次这道题了&#xff0c;不想写题解了&#xff0c;大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话&#xff1a; “利润不是赚出来的&#xff0c;是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业&#xff0c;很多企业看着销售不错&#xff0c;账上却没钱、利润也不见了&#xff0c;一翻库存才发现&#xff1a; 一堆卖不动的旧货…...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答题&#xff0c;大家注意呀&#xff01; 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:&#xff08; B &#xff09; A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

Spring数据访问模块设计

前面我们已经完成了IoC和web模块的设计&#xff0c;聪明的码友立马就知道了&#xff0c;该到数据访问模块了&#xff0c;要不就这俩玩个6啊&#xff0c;查库势在必行&#xff0c;至此&#xff0c;它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据&#xff08;数据库、No…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在 GPU 上对图像执行 均值漂移滤波&#xff08;Mean Shift Filtering&#xff09;&#xff0c;用于图像分割或平滑处理。 该函数将输入图像中的…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求&#xff0c;并检查收到的响应。它以以下模式之一…...

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程&#xff0c;代码下载&#xff1a;这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中&#xff0c;**知识蒸馏&#xff08;Knowledge Distillation&#xff09;**被广泛应用&#xff0c;作为提升模型…...