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个列名的组合就形成了一个关键字,排序是按照这个大关键字来的)所以从左到右是有序可查的,而忽略左面,右面是没有顺序的
- 【mysql学习笔记】-索引
- MySQL索引学习笔记
- MySQL索引学习笔记
- MySQL学习笔记-索引
- MySQL学习笔记6:索引
- MySQL学习笔记6:索引
- MySql学习笔记----索引,外键
- Mysql学习笔记五,索引
- MySql 学习笔记二:索引
- MySQL之索引学习笔记
- MYSQL学习笔记二:索引
- mysql索引的学习笔记
- mysql学习笔记(2)-创建MySQL索引
- 【学习笔记】mysql索引原理之InnoDB
- MySQL学习笔记 3 索引、存储过程
- MySQL学习笔记之十一 索引
- mysql学习笔记之三(索引)
- MySQL学习笔记(23)-----------索引优化
- 我的第一条博客
- JavaEE中Web服务器、Web容器、Application服务器区别及联系
- 1451
- 1452
- 《徐徐道来话Java》:泛型的基本概念(1)
- MySQL索引学习笔记
- C++多线程初级一:创建进程
- 1459
- 1481
- Redis内存淘汰机制
- Codeforces Round #385 (Div. 1) B. Hongcow's Game(bitmask)
- 1671
- 序列求和
- 实现一个元素垂直居中的六种方式