MySQL索引

100 阅读6分钟

1. 什么是索引?

MySQL数据库中的索引其实就是一种可以快速获取数据的一种数据结构。通过索引可以快速的查询到想要的数据。

2. 索引的分类

2.1.按照功能分类:

  • 普通索引: 最基本的索引,它没有任何限制。
  • 唯一索引:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值组合必须唯一。
  • 主键索引:一种特殊的唯一索引,不允许有空值。一般在建表时同时创建主键索引。
  • 组合索引:顾名思义,就是将单列索引进行组合。
  • 外键索引:只有InnoDB引擎支持外键索引,用来保证数据的一致性、完整性和实现级联操作。
  • 全文索引:快速匹配全部文档的方式。InnoDB引擎5.6版本后才支持全文索引。MEMORY引擎不支持。

2.2.按数据结构分类:

  • B+Tree索引 :MySQL使用最频繁的一个索引数据结构,是InnoDB和MyISAM存储引擎默认的索引类型。

  • Hash索引 : MySQL中Memory存储引擎默认支持的索引类型。

2.2.1.B+Tree索引的优势:

B+树是一种非常高效的索引数据结构,具有以下几个优势:

  • 查询速度快:所有叶子节点都在 B+树 的同一层中,这意味着对于任何查询操作,最多只需要访问一次磁盘即可获取所需数据,从而大大提高了查询速度。

  • 顺序性:B+树在设计时将热点数据放置在更靠近根节点的位置,可以有效地利用磁盘预读技术,提高顺序扫描数据的性能。这对于范围查询和分页等操作非常有用。

  • 可扩展性:B+树支持插入和删除操作,并且由于所有非叶子节点都不存储实际数据,因此扩展 B+树 相对比较容易,并且增加或删除一个元素时只需要更新少量节点即可

  • 对磁盘I/O的友好性:B+树算法的设计使得它能够尽可能地减少磁盘 I/O 操作次数,也就意味着可以提高磁盘的读取效率,从而使数据库系统处理更多请求并获得更好的响应时间。

  • 高效的打开/关闭/恢复机制:B+树索引的设计使得数据库系统能够高效地打开、关闭和恢复一个数据表或索引,从而达到快速开始操作的目的。

总之,B+树具有查询速度快、支持可扩展性、对磁盘 I/O 友好等优势,是数据库系统高效存储和访问巨大数据集合的关键技术。

2.2.2.B树和B+树的核心区别

B树和B+树是两种常见的索引数据结构,它们之间的核心区别在于:

  • 存储方式:B树的每一个节点都包含子节点和元素,而B+树的非叶子节点只包含子节点,不含图节点对应的元素,所有的元素都存储在叶子节点上。因此,B+树可以容纳更多的子节点,具有更高的“分支系数”,从而可以实现更快的查询速度

  • 叶子节点:B树和B+树叶子节点的结构也不同,B树的叶子节点存储着具体数据的指针,而B+树的叶子节点仅仅是对数据的索引项,存储了所有数据记录的索引信息,需要再配合磁盘I/O才能访问到数据。这意味着在进行范围查询时,B+树可以通过遍历链表的方式消除大量的磁盘 I/O 操作。

  • 排序方式:由于B树的根节点、非叶子节点以及叶子节点都带有关键字信息或数据information,所以B树可以轻松地进行顺序查找,甚至跳跃式查找,而B+树则只能进行指定单点查找,并且通常采用顺序排列的方式存储数据信息,因此更适合处理精确匹配查询效率高、范围查找的效率较低。

3. 索引的操作

3.1.创建索引

create index 索引名称 [索引类型](默认B+树) on 表名(列名);

3.2.查看索引

show index from 表名;

3.3.删除索引

drop index 索引名称 on 表名;

4.怎么看一个SQL需要优化的地方?

优化 SQL 的目的是为了让查询语句更快地执行并且使用更少的资源。因此,当我们发现一条SQL语句性能较差时,需要进行以下几个方面的检查和分析:

  • 查询计划:查询计划是 SQL 服务器对 SQL 查询语句执行的解释和执行步骤的展示,可以通过“Explain”命令或查询执行计划进行查看。通过查询计划可以分析出是否存在全表扫描、是否存在索引扫描等问题。

  • 索引:SQL 查询语句中必须有相应的索引支持,以便使查询语句具有更快的速度。通过分析索引信息,可以帮助理解为什么一个查询能够快速响应或者为什么一个查询变得缓慢了。

  • 子查询:子查询在执行过程中可能会产生大量的 I/O 操作和 CPU 负载,从而影响查询性能。特别是在大数据集上的查询时,尽量避免在 SELECT 语句中使用子查询。

  • 连接:当在多个表之间执行联接时,要确保连接操作正确,并且只返回所需的行数。如果频繁使用 JOIN 语句,那么就需要考虑是否可以使用视图或我们称之为“冗余表”的方式来提高查询效率。

  • 数据存储和分布:对于大型数据集,可以考虑将数据进行水平或垂直划分,并且在查询时只访问必要字段或者是必要分区的数据。

  • 锁定策略和事务管理:锁定策略和事务管理机制可以对SQL查询产生很大的影响,因此需要了解不同的锁定机制和事务管理策略的优缺点。尤其是在高并发场景中,避免使用会产生死锁的锁定操作。

总之,在分析 SQL 查询性能时,需要综合考虑查询计划、索引、子查询、连接、数据存储和分布、锁定策略和事务管理等因素,并对相应的问题进行调优和解决。

5.实战练习

给一道SQL,怎么建索引?

select orz,dt,ort 
from tb 
where dt >= '2021-10-03' and dt <= '2021-10-25' and/or ort in (4,5,6)

针对这道 SQL 查询语句,可以根据 where 子句中涉及到的条件建立以下两个索引:

(dt, ort) 索引:针对 WHERE 子句中的 dt 条件和 ort 条件,可以创建一个联合索引。该索引将在表中建立一个按照日期(dt)来排序的子集,然后再根据配送区域(ort)进行排序。这样做能够显著加快查询速度。

create index idx_dt_ort on tb (dt,ort);

(ort) 索引:如果 WHERE 子句中仅包含了 ort 条件,可以考虑只建立针对 ort 列的单列索引。

需要注意的是,在选择哪些列或组合列建立索引时,要充分考虑到 SQL 查询语句中出现的所有条件,而不是仅仅构建一组与供查询语句完全匹配的索引。

create index idx_ort on tb (ort);