MySQL数据库学习-进阶索引(1)

2025-08-12

索引概述

索引index是帮助MySQL高效的获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。

优缺点:提高数据检索效率,降低数据库IO成本;降低数据排序成本,降低CPU消耗。索引列占用空间,索引大大提高了查询效率,同时也降低了更新表速度,如对表进行INSERT、UPDATE、DELETE时,效率降低。

索引结构

MySQL索引在引擎层实现,不同引擎不同的索引。

二叉树——红黑树——多路平衡查找树(B树)——B+树

B树:B树是一个多路平衡查找树,每个节点包含多个键值(而不是二叉树的一个键值),节点内的键值是有序的。B树的每个节点有多个子节点,每个子节点对应着一个范围的键值。所有叶子节点都在同一层级,保证了查询的平衡。每个节点可以存储多个键值对,节点之间的分裂和合并都在内部进行,避免频繁的磁盘读取。

B+树:B+树是B树的一个变种,所有的键值都存储在叶子节点,内部节点仅存储索引信息。叶子节点通常通过指针链表连接,形成一个有序链表,便于范围查询。内部节点不存储实际数据,只有指向子节点的指针,使得B+树的查询更加高效。

MySQL索引在此基础上增加了一个指向相邻叶子节点的链表指针,就形成了带有顺序指针的B+Tree,提高区间访问的性能。InnoDB采用B+树索引,一是考虑都层浅,效率更高;二是相对于B树,页只存储指针和键值,子节点才存储数据,这样使得每一页可以有更多的指针和键值,层相对于B树更浅;三是可以支持范围查询和排序,而hash索引不支持。

https://www.cs.usfca.edu/~galles/visualization/BTree.html】

Hash:哈希索引就是采用一定的hash算法,将键值换成新的hash值,映射到对应的槽位上,然后存储到hash表中。 特点:Hash索引只能对等比较(= in),不支持范围查询;无法利用索引完成排序操作;查询效率高,通常只需要一次检索就可以了,效率通常更高于B+tree索引。 引擎支持:Memory支持hash索引,但在InnoDB中也有自适应hash功能,hash索引是存储引擎根据B+Tree索引在指定条件下自动构建的。

索引分类

分类含义特点关键字
主键索引针对于表中主键创建的索引默认自动创建,只能有一个PRIMARY
唯一索引避免同一个表中某数据列中的值重复可以有多个UNIQUE
常规索引快速定位特定数据可以有多个
全文索引全文索引查找的是文本中的关键词,而不是全文比较索引中的值可以有多个FULLTEXT

索引存储形式分类

聚集索引将数据存储与索引放到一块,索引结构的叶子节点保存了行数据必须有,只有一个
二级索引将数据与索引分开存储,索引结构的叶子节点关联的是对应的主键可以存在多个

聚集索引:如果存在主键,主键索引就是聚集索引。如果不存在主键,将使用第一个唯一UNIQUE索引作为聚集索引。如果表没有主键,或没有合适的唯一索引,则InnoDB会自动生成一个rowid作为隐藏的聚集索引。

回表查询:就是二级索引查到主键后返回到聚集索引获取行数据。

索引语法

SQL性能分析

SQL执行频率:插入、更新、查询、删除频率。SHOW [SESSION|GLOBAL] STATUS LIKE 'Com_______'

**慢查询日志:**用来记录所有执行时间超过long_query_time单位秒,默认10。存储在/var/lib/mysql MySQL中慢查询日志默认没有开启,需要在MySQL中配置文件/etc/my.cnf中配置如下信息: slow_query_log=1 # 开启 long_query_time=2 # 设置时间

**profile详情:**show profiles可以帮助我们了解SQL时间都耗费到哪里了。通过have_profiling参数,能够看到当前MySQL是否支持profile操作:select @@have_profiling;

select @@have_profiling;
select @@profiling;
set @@profiling=1;
use industrial_project_management;
select project_name from projects where status='Planning';
show profiles;
show profile for query 3;  --查看某个具体语句的细节
show profile cpu for query 3;  --查看某个具体语句的细节

**explain:**常用,直接在语句之前加入explain;

索引使用

索引设计原则


← 返回