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。在一个信息页中,用户记录是按照主键由小到大的顺序串联而成的单向链表。然后在一个信息页中,将数据分组变成"槽",类似于提取了一层目录,目录同理也是连续的,这就是在一个数据页内快速查询主键的方式。
如果要查询主键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