mysql索引 红黑树_mysql主键索引为什么用B+树而非B树,红黑树等

mysql主键索引为什么用B+树而非B树,红黑树等

mysql主键索引为什么用B+树而非B树,红黑树等

接下来我们就通过了解B+树去全面解决这几个问题。

一、B+树的数据结构

树的概念我的就赘述了,其他文章都写的非常清楚了。

我们要注意的一个点:InnoDB和MyIsam在存储的区别。

InnoDB

主键索引的存储结构是:叶子节点存储了主键值和其他字段数据值

其他索引的存储结构是:叶子节点存储了索引值和主键索引值

区别是其他索引存的是主键索引值

MyIsam

索引的存储结构是:叶子节点存储了主键值和数据记录的地址

主键索引和其他索引存储结构是一样的

说B+树之前先说说B树,B+树是在B树基础上优化来的。

B树索引格式

4e65f601bb2a129564301900e36cd3d7.png

B树的缺点:会因为树的深度过深而造成IO次数变多,从而影响查询效率。

再来看看B+树索引格式

99bcbde1f82fb1f54ce792d3776ff5fb.png

B+树跟B树区别:B+树数据只存在叶子节点,这样每个节点存储的数据会变多,从而存储大量数据时树的深度会比B树少很多很多,基本三层B+树就能存储千万级别的数据。所以MySQL才会选择B+树,减少磁盘IO,提高读取效率。不选二叉树或红黑树都是同样的道理。

那为什么不选哈希表呢?

哈希索引没办法利用索引完成排序。

不能进行多字段查询。

在有大量重复键值的情况下,哈希索引的效率也是极低的(出现哈希碰撞问题)。

不支持范围查询。

回表是什么

二级索引存储的是主键ID,所以通过二级所以查询的过程是:先去查主键ID,再通过主键ID去查询数据,这个过程称为回表。

二、索引相关

184f15bd448af4ba7ebac2ac8efc87ec.png

聚簇索引:InnoDB的主键索引是聚簇索引。一个表中只能拥有一个聚集索引。

非聚簇索引:InnoDB的普通索引是非聚簇索引。MyIsam的索引就是非聚簇索引。

覆盖索引:select的数据列只用从索引中就能够取得,不必从数据表中读取,即查询列要被所使用的索引覆盖。

不建议使用select * 查询也是有这个部分这个原因。

还有优化 limit 90000,10这种SQL语句核心也是使用覆盖索引提高效率。

索引下推:只能用于二级索引。

mysql>select * from user where name like '张%' and age > 10

假设创建了联合索引(name,age)

1

2

这条SQL语句会怎么执行呢?

a. 根据(name,age)联合索引查询所有满足名称以“张”开头的索引,然后回表查询出相应的全行数据,然后再筛选出满足年龄小于等于10的用户数据

b. 根据(name,age)联合索引查询所有满足名称以“张”开头的索引,然后直接再筛选出年龄小于等于10的索引,之后再回表查询全行数据

很明显,b的查询方式回表查询的全行数据比较少,这个过程就是索引下推。

MySQL默认启用索引下推

最左原则

大家可能都知道的是一个联合索引(a, b , c),如果查询条件是

where a = x

where a = x and b = x

where b = x and c = x and a = x

这样是能用到索引的。但是下面2种情况就不能完全使用索引:

where a = x and c = x

索引覆盖a, c列不能走索引

where a = x and b > x and c = x

索引覆盖a和b,因b列是范围查询,因此c列不能走索引

IN 在 where 中,也属于准确查询,不会使后面索引失效。

遇到范围查询(>、

联合索引怎么存储:把主键ID(3)的值替换成功联合索引的值(“张三”,30),叶子节点存放主键ID值。

总结

MySQL的索引还是比较简单的,很多都是概念性问题比较简单。掌握了B+树的索引格式基本其他问题都迎刃而解了。

mysql主键索引为什么用B+树而非B树,红黑树等相关教程

Mysql SQL优化查询效率

Mysql SQL优化查询效率 近期在项目中遇到一个功能模块数据量稍大的地方,本地开发和测试功能都没啥问题,上了正式环境,问题就体现出来了,因为正式环境需要从第三方导入很多数据,然后正式环境的列表加载基本要几十秒甚至根本加载超时(微服务连接超过一定时

mysql 三范式

mysql 三范式 第一范式(1NF):数据库中每一列都是不可再分的。 【 比如说文章表的tagid,以 ”逗号“ 隔开,商品表的轮播图以 “竖线” 隔开,这种设计方式是不满足第一范式的 】 要求数据达到原子性,使数据不可再分; 第二范式(2NF): 使每一行数据具有

Dockek系列之-Mysql/Redis/Nginx等服务重启,以及自启动设置

Dockek系列之-Mysql/Redis/Nginx等服务重启,以及自启动设置 文章目录 前言 一、重启步骤 1.查看所有已安装容器 2.重新启动容器 3.查看容器启动进程 4.界面展示(服务启动没有问题) 二、自重启设置 1.Docker服务自启动设置 2.Mysql服务自启动设置 3.其他服务

mysql主从(主宕从上)之主从恢复数据不丢失

mysql主从(主宕从上)之主从恢复数据不丢失 环境模拟:主从结构、主库故障,从库升级为主库,新主写入数据,之后主从恢复,将主库故障期间新主写入的数据成功导入主库 环境部署 系统版本 CentOS Linux release 7.5.1804 (Core) 内核版本 3.10.0-862.el7.x86_

MySql数据存储原理及索引介绍

MySql数据存储原理及索引介绍 基本架构图,分为Server层和引擎层 1.1 Server层 Server层主要是负责提供对客户端的接口连接, 解析 SQL 语句,搭载缓存 1.1.1 连接器 执行 mysql -h $ip -P $port -u $user -p 命令就是通过连接器建立客户端与服务器的连接 show

Mac下MySQL安装与启动采坑指北

Mac下MySQL安装与启动采坑指北 Mac下MySQL安装与启动采坑指北 ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) MAC mysql安装教程很多,通常使用homebrew安装即可, brew install mysql 这里我就不再累述。 1、注意环

Mysql学习

Mysql学习 Mysql学习 文章目录 Mysql学习 一、什么是数据库?数据库系统?数据库管理系统? 二、Mysql数据库 1. 特点: 2. 5.6版本新特性: 3. 安装目录: 4. 登录与退出: 5.Mysql语句的规范: 6.Mysql常用命令: 7.修改Mysql命令提示符: 8.数据表 9.Mysql

C#连接MySQL数据库遇到的问题

C#连接MySQL数据库遇到的问题 使用VS2019和MySQL5.7进行连接,在winform窗体中输入的信息一直无法和数据库中的内容进行匹配,给大家分享一下我的经验,希望可以帮助到大家。 如果我们想在VS中和MySQL进行连接,需要导入Mysql.Data.dll,该文件可以在官网直接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值