简介: 索引就是帮助Mysql高效获取数据排好序的数据结构。例如hash,红黑树,B数。
1.Mysql索引的实现原理
索引是什么一个最简单的就是我们一本教科书或者资料的目录可以帮助我们快速定位找到我们想找的东西。
数据结构有很多种而mysql则选择的是另一种B+treed的数据结构,然而为什么要选择b+tree呢?
mysql的设计人员也是考虑很多的,对于一个普通的等值查询,基本的数据及结构都是全表扫描。效率是相当慢的,二叉树和b数虽然解决了但是对于范围查询那开销也是非常大了。
![](http://dsvip1.vip/mysql1.png)
2.数据库的存储引擎
mysql数据库常用的两个存储引擎
(1)Myisam引擎(非聚集索引)
如果我们创建一个use表用Myisam引擎的就会生成3个文件
![](http://dsvip1.vip/mysql2.png)
user.MYI索引文件
user.MYD数据文件
user.frm数据结构类型
1.当我们通过id去查询一条数据的时候,先会查看MYI中有没有以id为索引的索引数
2.根据id索引找到叶子节点的id,从而拿到该id对应的数据地址,叶子节点没有储存数据,要通过队形的数据地址去MYD数据文件中去获取数据。
![](http://dsvip1.vip/mysql3.png)
(2)InnoDB引擎(聚集索引)
虽然InnoDB也使用的B+Tree作为索引结构,但是具体的实现方式却不一样。
InnoDB的数据文件本身就是索引文件,MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。而在InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。
![](http://dsvip1.vip/mysql4.png)
(3)两种存储引擎的区别
1.show index from tablename //查看表有那些索引
MyISAM:支持全文索引;不支持事务;它是表级锁;会保存表的具体行数.
InnoDB:sql5.6以后才有全文索引;支持事务;它是行级锁;不会保存表的具体行数.
一般:不用事务的时候,count计算多的时候适合myisam引擎。对可靠性要求高就是用innodby引擎。推荐用InnoDB引擎.
加了索引之后能够大幅度的提高查询速度,但是索引也不是越多越好,一方面它会占用存储空间,另一方面它会使得写操作变得很慢。通常我们对查询次数比较频繁,值比较多的列才建索引。
在有主键的表中插入数据行,由于有主键唯一性的约束,所以需要保证插入的数据没有重复。我们来比较下主键为聚集索引和非聚集索引的查找情况:聚集索引由于索引叶节点就是数据页,所以如果想检查主键的唯一性,需要遍历所有数据节点才行,但非聚集索引不同,由于非聚集索引上已经包含了主键值,所以查找主键唯一性,只需要遍历所有的索引页就行(索引的存储空间比实际数据要少),这比遍历所有数据行减少了不少IO消耗。这就是为什么主键上创建非聚集索引比主键上创建聚集索引在插入数据时要快的真正原因。
![](http://dsvip1.vip/mysql10.png)
![](http://dsvip1.vip/mysql6.png)
(4)Mysql的varchar数据类型的变化
4.0版本以下,varchar(100),指的是100字节,如果存放UTF8汉字时,只能存33个(每个汉字3字节)
5.0版本以上,varchar(100),指的是100字符,无论存放的是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放100个。
(5)B+tree的特性
(1)由图能看出,单节点能存储更多数据,使得磁盘IO次数更少。
(2)叶子节点形成有序链表,便于执行范围操作。
(3)聚集索引中,叶子节点的data直接包含数据;非聚集索引中,叶子节点存储数据地址的指针。![](http://dsvip1.vip/mysql5.png)