聊一聊MySql的索引

Mysql的索引可以提高查找效果,效果有多明显呢。
表结构为:

CREATE TABLE `user_innodb` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `gender` tinyint(1) DEFAULT NULL,
  `phone` varchar(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

并插入五百万条数据
为name创建索引之前

SELECT * FROM user_innodb WHERE name = "Charles Barnes";

查询时间为2.539s

为name创建索引之后

SELECT * FROM user_innodb WHERE name = "Charles Barnes";

查询速度为0.130s

对于百万数据量来说,这种优化速度十分惊人。

索引的底层是什么,为什么会这么快?

简单来说,索引的底层是B+树,InnoDB存储引擎使用了B+树。

MySql使用InnoDB存储引擎,InnoDB存储引擎提供了四种行格式来保存向mysql中插入的数据,称为记录。

InnoDB存储引擎将数据划分为若干个页,以页作为磁盘和内存之间交互的最小单位16kb。在一个信息页中,用户记录是按照主键由小到大的顺序串联而成的单向链表。然后在一个信息页中,将数据分组变成"槽",类似于提取了一层目录,目录同理也是连续的,这就是在一个数据页内快速查询主键的方式。

b+树结构

如果要查询主键id为14的记录,就可以通过目录快速查找到。

b+树的节点

b+树的最底层节点被称为叶子节点,其他的节点自然叫做非叶子节点,b+树最顶部的节点叫做根节点。

b+树的哪个节点存储了数据?

叶子节点,这是LnnoDB引擎的唯一存储方式。

除了b+树还有几种索引方式?

InnoDB引擎提供了四种,b+树是最常用的。

索引中的回表

在普通索引中,根据name索引他不只存储用户的name,而是将name和主键id存储为一个完整的用户记录,对先查找主键中再对用户记录进行返回,这个过程叫回表。

联合索引

一个索引覆盖表中的两个字段,或多个字段,用在多字段查询时。并且联合查询有最左原则,如果查询没有使用索引最左的字段,索引失效。

联合索引的b+树是什么样的?

例如联合索引(name,phone),叶子节点就存放了name,phone,id,先根据name查找,name相同就根据phone查找,phone相同就根据id查找。

参考:https://zhuanlan.zhihu.com/p/479164948

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CaryJohnson

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值