MySQL

MySQL索引

什么是索引(index)?

帮助MySQL提高查询效率的是数据结构。能实现快速定位数据的一种存储结构,其设计思想是以空间换取时间。

索引的缺点:

  • 维护索引需要耗费数据库资源;
  • 需要占用磁盘空间;
  • 对表数据进行增删改的时候,因为要维护索引,速度会受到影响。

索引的分类:主键索引、唯一索引、普通索引、复合索引

  • 按数据结构分类:B+tree索引、Hash索引、全文索引(*)
  • 按物理存储分类:聚簇索引(主键索引)、二级索引(辅助索引)
  • 按字段特性分类:主键索引、唯一索引、普通索引、前缀索引
  • 按字段个数分类:单列索引、联合索引

InnoDB支持:
  • 主键索引:设定为主键后数据库会自动建立索引,innodb为聚簇索引
  • 单值索引(单列索引/普通索引):即一个索引只包含一个列,一个表中可以有多个单列索引 id (age index) (name index) bir
  • 唯一索引:索引列的值必须唯一,允许为空值,且只存在一个null(区别主键索引,值不为null)
  • 复合索引:即一个索引包含多个列 id (age name) index 基于多个列的索引

MyISAM支持(MySQL5.7版本之前只能用于MyISAM引擎):
  • Full Text全文索引:全文索引类型为FULLTEXT,在定义索引的列上支持值的全文查找,允许在这些索引列中插入重复值和空值。全文索引可以在CHAR、VARCHAR、TEXT类型列上创建。MYSQL只有MYISAM存储引擎支持全文索引。

一、普通索引创建的两种方式:
  1. 建表之前创建(craete table t_user(id primary key,name,key(name));)
  2. 建表之后创建(create index name_index on t_user(name);
二、唯一索引创建的两种方式:
  1. 建表之前创建(craete table t_user(id primary key,name,unique(name));)
  2. 建表之后创建(create unique index name_index on t_user(name);
三、复合索引创建的两种方式:
  1. 建表之前创建(craete table t_user(id primary key,name,age,key(name,age));)
  2. 建表之后创建(create index nameAge_index on t_user(name,age);

利用符合索引:1. 最左前缀原则/左包含原则;(比如根据name,age,bir设置的索引,只能利用name/name,age/name,age,bir来索引)2.MySQL引擎在查询为了更好利用索引,在查询过程中会动态调整查询字段顺序以便利用索引


索引的原理:

  1. 插入id无序数据
  2. 查询结果发现id居然排序了
  3. 说明主键索引进行了排序:方便快速查询(排序之后查询更快)


B+Tree相对于B-Tree有几点不同:

  1. 非叶子节点只存储键值信息
  2. 所有叶子节点之间都有一个链指针
  3. 数据记录都存放在叶子节点中
    (注:MySQL的InnoDB存储引擎在设计时是将根节点常驻内存的,减少一次对磁盘的I/O操作)

聚簇索引和非聚簇索引:

  • 聚簇索引:将数据存储和索引放到了一块,索引结构的叶子节点保存了行数据
  • 非聚簇索引:将数据与索引分开存储,索引结构的叶子节点指向了数据对应的位置

在InnoDB中,在聚簇索引之上创建的索引称为辅助索引,非聚簇索引都是辅助索引,像复合索引、普通索引、唯一索引。辅助索引叶子节点存储的不再是行的物理位置,而是主键值,辅助索引访问位置总是需要二次查找


在 MySQL 的 InnoDB 引擎中,每个索引都会对应一颗 B+ 树,而聚簇索引和非聚簇索引最大的区别在于叶子节点存储的数据不同,聚簇索引叶子节点存储的是行数据,因此通过聚簇索引可以直接找到真正的行数据;而非聚簇索引叶子节点存储的是主键信息,所以使用非聚簇索引还需要回表查询,因此我们可以得出聚簇索引和非聚簇索引的区别主要有以下几个:

  • 聚簇索引叶子节点存储的是行数据;而非聚簇索引叶子节点存储的是聚簇索引(通常是主键 ID)。
  • 聚簇索引查询效率更高,而非聚簇索引需要进行回表查询,因此性能不如聚簇索引。
  • 聚簇索引一般为主键索引,而主键一个表中只能有一个,因此聚簇索引一个表中也只能有一个,而非聚簇索引则没有数量上的限制。

MySQL内部技术架构

MySQL事务

MySQL日志

MySQL开发

相关推荐
Tipriest_5 分钟前
linux中的文本分接流tee命令介绍
linux·服务器·数据库
爱喝水的鱼丶6 分钟前
SAP-ABAP:在SAP世界里与特殊字符“斗智斗勇”:一份来自实战的避坑指南
运维·服务器·数据库·学习·sap·abap·特殊字符
阿拉伯柠檬7 分钟前
MySQL内置函数
linux·数据库·mysql·面试
雅俗共赏zyyyyyy8 分钟前
SpringBoot集成配置文件加解密
java·spring boot·后端
小Mie不吃饭12 分钟前
2025 Oracle小白零基础到入门的学习路线
数据库·oracle
计算机学姐16 分钟前
基于SpringBoot的送货上门系统【2026最新】
java·vue.js·spring boot·后端·mysql·spring·tomcat
麒qiqi17 分钟前
SQLite3 数据库
数据库·oracle
不吃橘子的橘猫30 分钟前
NVIDIA DLI 《Build a Deep Research Agent》学习笔记
开发语言·数据库·笔记·python·学习·算法·ai
算法与双吉汉堡33 分钟前
【短链接项目笔记】6 短链接跳转
java·开发语言·笔记·后端·springboot
飞浪35 分钟前
告别“Hello World”:一个有经验的程序员如何用 FastAPI 打造生产级后端模板
后端