索引是一种数据结构,使用它可以快速的查询和检索数据。它可以看做是一本书的目录介绍,使用它可以快速地定位到需要查询的内容。
索引分类
索引一般可以分为以下几类:
- 主键索引:主键索引是一种特殊的索引类型,它是用于唯一标识每一行数据的索引,每个表只能有一个主键索引。
- 唯一索引:唯一索引是用来保证列的唯一性的索引,一个表可以有多个唯一索引。
- 普通索引:普通索引也叫非唯一索引,它是最常见的一种索引类型,可以加速查询和排序操作。
- 全文索引:全文索引是一种用于全文搜索的索引类型,能够对文本数据进行快速的模糊搜索和关键字搜索。
- 复合索引:复合索引也叫多列索引或联合索引,它是包含多个列的索引类型,能够加速多列查询和排序操作。
- 哈希索引:哈希索引是基于哈希表实现的索引类型,能够对等值查询进行高效的处理,但不支持范围查询和排序,MySQL 中 Memory 引擎中支持哈希索引。
优缺点分析
索引的主要优点如下:
- 提高查询效率:索引可以加速数据的检索速度,对于大量数据的表而言,使用索引可以大幅提高查询效率。
- 避免全表扫描:当没有索引时,数据库会进行全表扫描,而索引可以帮助避免全表扫描,加速查询。
- 增强数据的唯一性和完整性:可以通过在列上创建唯一索引和主键索引来确保表中的数据唯一性和完整性。
索引的缺点如下:
- 占用额外存储空间:每个索引都会占用额外的存储空间,因此在设计索引时需要权衡存储空间和查询效率之间的平衡。
- 降低写操作效率:索引的维护需要额外的写操作,因此在大量写操作的情况下可能会降低写操作的效率。
- 可能出现索引失效:索引并不是万能的,有些情况下使用索引可能会导致查询效率降低甚至出现索引失效的情况。例如,当对于一个非常小的表或者一个稠密的索引列进行查询时,使用索引可能并不会提高查询效率。
- 索引需要维护:随着表数据的不断变化,索引也需要不断维护以保持其效率。因此,在使用索引时需要注意索引的维护成本。
应用场景
适合创建索引的场景有以下几个:
- 频繁用于条件查询的列:如果一个列经常用于 WHERE、JOIN、ORDER BY 或 GROUP BY 子句中,那么可以考虑在该列上创建索引。
- 唯一性约束:对于需要保证唯一性的列,应该在该列上创建唯一索引或主键索引。
- 经常用于排序的列:对于需要经常进行排序的列,如 ORDER BY 子句中的列,应该在该列上创建索引。
- 经常用于聚合函数的列:对于经常用于聚合函数(如 COUNT、AVG、SUM、MIN、MAX)的列,应该在该列上创建索引,可以加速聚合查询。
虽然索引可以提高查询效率,但有些情况下并不适合使用索引,比如以下这些:
- 对于小表:如果表的数据量比较小,那么建立索引并不能带来很大的性能提升,反而会增加查询时间和占用存储空间。
- 对于多写少读的表:索引会增加写操作的时间,并占用更多的存储空间,因此对于频繁进行 INSERT、UPDATE 或 DELETE 操作的表,不宜过多地建立索引。
总之,创建索引需要根据具体的情况进行权衡和取舍,只有在真正需要提高查询效率时才应该创建索引,否则会浪费存储空间和增加写操作的时间。
特殊说明
以上内容来自我的《Java 面试突击训练营》,这门课程是有着十几年工作经验(前 360 开发工程师),10 年面试官经验的我,花费 4 年时间打磨完成的一门视频面试课。学完训练营的课程之后,基本可以应对目前市面上绝大部分公司的面试了,并且课程配备了 9 大就业服务,帮助上千人找到 Java 工作,其中上百人拿到大厂 Offer,学员最高薪资 70W 年薪,面试课目录和 9 大服务如下:
加我微信咨询:vipStone【备注:训练营】