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开发

相关推荐
uhakadotcom22 分钟前
WebGPU:解锁浏览器中的高性能图形和计算
后端·面试·github
uhakadotcom22 分钟前
【新手必看】 Mitsuba科研渲染器入门指南:从零玩转光影魔术
后端·面试·github
Kairo_0127 分钟前
如何优化SQL查询以提高数据库性能?
数据库·sql·oracle
uhakadotcom36 分钟前
深度学习超级采样(DLSS)技术解析
后端·面试·github
Apifox39 分钟前
一分钟,让你的 API 文档支持 MCP 使用,Apifox 新功能上线!!!
前端·后端·mcp
鲁子狄1 小时前
[笔记] SpringBoot3 使用 EasyExcel 封装工具类实现复杂 Excel 数据处理:使用Java构建高效的数据导入解决方案
java·后端
lingdian231 小时前
spring-security原理与应用系列:核心过滤器
java·后端·spring·安全管理·spring-security
高铭杰1 小时前
Citus源码(1)分布式表行为测试
数据库·分布式·citus
鲁子狄1 小时前
[笔记] SpringBoot3 使用 EasyExcel 封装工具类实现,自定义表头导出,并实现数据格式化转换与添加下拉框操作.
java·后端
华仔啊1 小时前
宝塔Docker安装Jenkins打包详细步骤,小白也能轻松使用流水线部署微服务(超详细)
后端·jenkins