Mysql底层重点

索引分类:

按物理存储分类:聚簇索引(主键索引)、二级索引(辅助索引)

按字段特性分类:主键索引,普通索引,唯一索引,前缀索引

按字段个数分类:单列索引,联合索引

主键索引:拿主键当作索引,

普通索引:除主键之外的字段当做索引

二级索引:除主键之外的字段被查询时,就是二级索引

覆盖索引:从非主键索引中就能查到记录,不需要查询主键索引,减少了树的搜索次数,显著提升性能。主键索引B+树存储的是整行数据,而普通索引B+树存储的是该索引字段数据和主键id。如果要查询的数据通过二级索引能查的出来,就不用回表再通过主键索引去查了,只用一个B+Tree就能找到数据。

联合索引:将多个字段组合成一个索引,多个字段值作为B+的key值,遵循最左匹配原则,如果不遵循索引就会失效。

联合索引的最左匹配原则,在遇到范围查询(如 >、=、<) 的时候,就会停止匹配,也就是范围查询的字段可以用到联合索引,但是在范围查询字段的后面的字段无法用到联合索引。注意,对于>=、<=、between、like 前缀匹配的范围查询,并不会停止匹配。

InnoDB数据结构选择B+Tree 的原因:

B+Tree相比BTree,B树只在叶子树节点存放数据,而B树在非叶子树节点也要存放数据,相较于B树,B+树单个节点的数据两更小,在相同的I/O次数下,就能查询更多节点。而且B树叶子节点采用的双链表连接,适合Mysql中常见的基于范围的查找,B树无法做到这一点。

B+相比Hash,Hash找明确的值非常快,但是mysql很多都是范围查找,不适用Hash

B+相比二叉树,二叉树一个节点只能有两个子节点,所以其搜索复杂度为log2N,但是B+搜索复杂度为logdN,d是子节点的数量,这会比二叉树检索速度快很多。

索引优化:

前缀索引优化:适用于一些大字符串的字段,使用前缀索引可以减少索引项的大小。order by 无法使用前缀索引

覆盖索引优化:不需要查询出包含整行记录的所有信息,减少了很多回表的操作,也减少了I/O操作

主键索引最好自增:B+是按照主键顺序存放的,如果主键值是随机的,会出现主键值插入到现有数据中间页的情况,此时还需要移动其他的数据,有可能还要从一个页面复制数据到另一个页面(页分裂),影响查询效率。

主键字段长度不要太大,会影响二级索引占用的空间

防止索引失效:

  • 左右模糊匹配会失效
  • 查询条件中对索引列做了计算、函数、类型转换等操作
  • 不遵循最左匹配原则
  • where子句中,在OR前的列是索引列,OR后的列不是索引列,则会失效。
相关推荐
2301_77759937几秒前
mysql如何进行数据库容量规划_评估磁盘空间增长趋势
jvm·数据库·python
NineData36 分钟前
NineData 亮相香港国际创科展 InnoEX 2026,以 AI 加速布局全球市场
运维·数据库·人工智能·ninedata·新闻资讯·玖章算术
m0_3776182337 分钟前
Redis怎样应对大规模集群的重启风暴_分批次重启节点并等待集群状态恢复绿灯后再继续操作
jvm·数据库·python
imuliuliang1 小时前
存储过程(SQL)
android·数据库·sql
考虑考虑1 小时前
SQL语句中的order by可能造成时间重复
数据库·后端·mysql
2401_835956811 小时前
Golang怎么写基准测试benchmark_Golang基准测试教程【完整】
jvm·数据库·python
阿杰学AI2 小时前
AI核心知识129—大语言模型之 向量数据库(简洁且通俗易懂版)
数据库·人工智能·ai·语言模型·自然语言处理·向量数据库·vector database
SPC的存折2 小时前
D在 Alpine 容器中手动搭建 Discuz 全攻略(包含镜像一键部署脚本,可直接用)
linux·数据库·mysql·缓存
李兆龙的博客2 小时前
从一到无穷大 #67 大查询根因分析 - 从 PinSQL 到 RCRank
数据库·时序数据库
AgCl232 小时前
MYSQL-6-函数与约束-3/17
android·数据库·mysql