MySQL索引学习笔记

来源:互联网 发布:手机淘宝用什么付账 编辑:程序博客网 时间:2024/05/22 07:03

先来简单说说Hash索引和B+Tree索引。Hash索引的结构和Java中HashMap的实现非常相似,通过hash算法将索引值生成存储地址,因此Hash索引的精确查找是非常快速的(但是范围查找的话…就相当于没有索引了)。B+树索引则是通过将索引值以B+树的结构存储,每次查找都要遍历来查找索引值(但由于B+树是平衡有序的因此可以提升查找速度)。

接下来我们主要介绍mysql的两种存储引擎(当然还有其他的,但是暂时用不到没仔细看过):INNODB和MYISAM。这两个家伙都不显示支持Hash索引(就是说你没有办法人为建立Hash索引,只有当它自己觉得 嗯,这里可以建立Hash索引,它才去建立。ALTER TABLE table-name ADD INDEX index-name USING HASH (data_name); 如果你觉得这条语句可以帮你在mysql中建立Hash索引的话,那我只能告诉你,哈哈 ,你被骗了。不信的话你可以使用SHOW INDEXES FROM table-name来验证一下)它们都是使用B+Tree建立索引的。

1、来看看B-Tree、B+Tree长什么样子(盗图)

1)B-Tree
这里写图片描述
定义我就不说了直接来看特性:
a)任意非叶子节点最多有m个子节点,即m阶,非叶非根节点最少有m/2取天棚个子节点(关于这一点是由于B-Tree是平衡树,在平衡过程中必然会保证每个子节点有至少m/2个子节点,你问我怎么推导 我可以很负责任的告诉你,没试过!可以去Google上百度~)
b)每个节点有n个关键字,则有n+1个子节点
c)每个节点都是有序的,每个节点内部的关键字也是有序的
d)节点内部p1,k1,p2,k2,p3,k3,p4...其中p[i]代表指针指向子节点,k[i]代表关键字,并且
k[i]<k[i+1],p[i]子节点内部的关键字<p[i+1]子节点内部的关键字。
根据b)得出 关键字个数+1=指针个数

2)B+Tree
这里写图片描述
看起来很像,不点在于:
a)B+树非叶子节点的关键字和指针数相同,并且最左子节点的最左关键字和父节点的最左关键字相同,最
右子节点的最右关键字和父节点的最右关键字相同(就好像B-Tree是开区间,B+Tree是闭区间)。
这样B+树的叶子节点就保存了所有的关键字。
b)B+树所有的叶节点之间都有一个链指针。

2、InnoDB和MyISAM的数据存储结构(盗图)

1) MyISAM存储引擎
这里写图片描述
a)叶子节点保存的是数据的存储地址,也就是说索引和数据是分开保存的,索引的顺序并不影响真正的数据之间的顺序。如果新插入一条数据,只需要改变索引文件的存储顺序,数据文件顺序不必改变把数据放在末尾即可。这就是所谓的非聚集索引
b)主索引和辅助索引除了关键字不同外没什么差别

2)InnoDB存储引擎
这里写图片描述
a)这是主键索引的存储结构,叶子节点保存了真实数据(1号框中 15是主键,1,phpben是数据),如此索引的顺序和数据的真实顺序是一致的,并且数据和索引保存在一起。这就是聚集索引了。
b)下面的虚线框表示的是与事务管理相关的一些指针和数据。InnoDB就是通过这些来实现事务回滚的!
重要的事情说三遍:myisam不支持事务!myisam不支持事务!myisam不支持事务!

这里写图片描述
a)这是聚集索引的辅助索引的存储结构,叶子节点保存的不是真实的数据,而是这条记录的主键值。
先找到主键,再到主键索引中查找数据。也就是说如果你使用辅助索引查找数据,实际是进行了两次
查找。
b)那么我们就知道了如果主键越大(指字节数),那么相应的辅助索引占用空间就越大,主索引也越大。
所以适当控制主键大小可以提升查找效率,这也就是为什么有的公司会强制要求主键的字符长度。

3、关于主索引和辅助索引的说明
mysql表单必须要有主键,建立表单的时候mysql会根据主键自动帮你建立一个索引 称为主索引
根据你自己的需要建立的索引为 辅助索引

4、最左前缀原则
假设有a表 a1,a2,a3,a4,a5

creat index ind1 on a(a1,a2,a3)select * from a where a1="",a2="",a3=""select * from a where a1="",a2=""select * from a where a1=""都可以使用索引ind1但是select * from a where a2="",a3=""无法使用索引ind1

因为MySQL使用B+树实现索引结构,而B+树是有序的(当你使用联合索引的时候,3个列名的组合就形成了一个关键字,排序是按照这个大关键字来的)所以从左到右是有序可查的,而忽略左面,右面是没有顺序的

0 0
原创粉丝点击