什么是索引?

索引是数据库中的一种数据结构,用于快速定位表中特定数据
作用:

  • 大幅减少磁盘IO次数,提升查询速度
  • 加速WHERE,JOIN,ORDER BY ,GROUP BY 等操作

索引的优缺点

优点:

  • 提高查询速度,索引可以显著提高数据库查询的速度,特别是在大型数据库中,没有索引,数据库需要从头到尾扫描表,而有了索引,数据库可以直接定位到数据,从而大大加快查询速度
  • 优化查询性能: 通过使用索引,数据库可以更快地进行表与表之间的连接
  • 索引可以保证数据库表中每一行的唯一性
  • 加速分组和排序的时间

缺点:

  • 建立索引需要占用物理空间
  • 会降低表的增删改查效率,因为每次对表记录进行增删改,需要进行动态维护索引,导致增删改时间变长。

索引类型

  • 普通索引: 最基本的索引,没有任何限制
  • 唯一索引:索引列的值必须唯一,但是允许有空值,如果是组合索引,则不允许有空值
  • 主键索引: 是一种特殊的唯一索引,一个表只能有一个主键列,不允许为空值
  • 组合索引:一个索引包含多个列,实际开发中推荐使用组合索引
  • 全文索引:全文搜索的索引,FULLTEXT用于搜索很长一篇文章的时候,效果最好

主键索引和唯一索引的区别:
主键必是唯一,但是唯一不一定是主键
一张表上只能有一个是主键,但是可以有一个或者多个唯一索引。

索引的数据结构有哪些

索引的数据结构主要有B+树和哈希表,对应的索引分别为B+树索引和Hash索引。InnoDB引擎的索引类型有B+树索引和Hash索引。默认索引类型为B+树索引



聚簇索引

https://cloud.tencent.com/developer/article/2423070




1. 定义

聚簇索引简单理解就是将数据与索引放在一起,找到索引即找到了数据。换句话说,对于聚簇索引,其非叶子节点上存储的是索引字段的值,而叶子节点上存储的是对应记录的整行数据。


2. 核心特点

  • 一个表只能有一个聚簇索引(因为数据只能按一种物理顺序存储)。
  • 主键默认是聚簇索引。如果没有显式定义主键,InnoDB 会选择第一个UNIQUENOT NULL的列作为聚簇索引;如果不存在这样的列,InnoDB 会隐式生成一个隐藏的ROW_ID作为聚簇索引。
  • 数据按索引键的顺序存储。如果主键是自增的,新数据会顺序追加到当前页末尾;如果是随机值(如UUID),可能产生页分裂,影响写入性能。

3. 数据结构

  • B+树结构:聚簇索引使用 B+ 树实现,非叶子节点存储索引键,叶子节点存储完整的行数据。
  • 物理连续性:相邻的索引键对应的数据行在磁盘上也是相邻存储的,因此范围查询(如BETWEENORDER BY)效率极高。

4. 优点

  1. 主键查询极快:通过主键检索时,可直接定位到数据行。
  2. 范围查询高效:连续的数据存储使得范围扫描(如WHERE id > 100)或排序操作更快。
  3. 减少I/O次数:相邻数据可能在同一数据页中,减少了磁盘I/O。

5. 缺点

  1. 插入速度依赖主键顺序:如果主键是随机值(如UUID),可能导致频繁的页分裂和碎片化。
  2. 更新主键代价高:修改聚簇索引键会导致数据行物理位置的变动。
  3. 辅助索引依赖聚簇索引:非聚簇索引(二级索引)的叶子节点存储的是主键值,因此回表查询可能带来额外开销。

6. 对比非聚簇索引

  • 非聚簇索引(如 MyISAM 引擎的索引):叶子节点存储的是指向数据行的指针(如物理地址),索引和数据是分离的。
  • 回表查询:通过二级索引查询时,需先查到主键,再通过聚簇索引定位数据行(两次查找)。

7. 应用场景

  • 高频主键查询:如 OLTP 系统中按主键检索订单、用户信息。
  • 范围查询:如按时间范围查询日志记录。
  • 排序操作:频繁使用ORDER BY的查询。

示例

假设有一张orders表,主键是自增的order_id

  • 数据按order_id顺序存储在磁盘上。
  • 查询WHERE order_id = 100时,直接通过聚簇索引找到数据行。
  • 查询WHERE order_date BETWEEN '2023-01-01' AND '2023-01-31'时,如果order_date是二级索引,需先查到对应的order_id,再回表查询完整数据。

总结回答

“聚簇索引是一种将数据行物理存储顺序与索引键顺序一致的索引结构,其叶子节点直接存储数据。InnoDB 中主键默认是聚簇索引,适合主键查询和范围扫描,但插入性能受主键顺序影响。与非聚簇索引(如 MyISAM)相比,它的优势在于减少回表查询,但需要合理设计主键以避免页分裂。”