索引介绍
索引是个什么东西
官方介绍:帮助mysql高效获取数据的数据结构。简单说,数据库的索引就跟书的目录是一个东西,能够 帮助我们更快的找到我们想要的东西,提高数据库的查询速度。
索引的优劣势
索引的优势
- 检索:索引可以提高数据库的查询效率,降低查询的IO成本。
- 排序:通过索引列对数据库进行排序,可以降低CPU的消耗.
- 被检索的索引会进行自动排序,包括单列索引和组合索引,组合索引的排序会更复杂
- 如果按照索引列的顺序进行排序,就是order by,效率就会提升较多
- where索引列会在存储引擎层进行处理,也就是索引下推
索引的劣势
- 索引会占据磁盘空间
- 索引可以提高查询效率,但是会降低更新表的效率,就是增删改,因为MYSQL不仅需要保持数据,同时需要更新对应的索引文件。
索引的分类
- 主键索引:根据表的主键mysql自动创建的索引,不允许重复,也不允许null
- 单列索引:即一个索引只包含单个列,一个表可以有多个单列索引
- 唯一索引:索引列的值必须唯一,但允许有空值
- 组合索引:多个列组合成的索引
- 全文索引:将整个文本形成索引,mysql中只有MyIASM和Innodb支持
索引的原理分析
索引的存储结构
索引是由存储引擎实现的,因此不同的存储引擎会使用不同的索引。MyISAM和Innodb默认的索引是B+Tree。Memory支持HASH和BTree。
B树和B+树
这里给大家推荐一个数据结构的演示网站,个人觉得挺好的 www.cs.usfca.edu/~galles/vis…
- B树
- B+Tree
两者区别
二者的主要区别就是在于非叶子节点是否存储数据.B树的叶子节点和非叶子节点都会存储数据。而B+树只有叶子节点才会存储数据,而且存储的数据都是在一行上,而且从图中可以看出来是有序的,形成一个单向的链表。
非聚集索引(MyISAM)
主键索引和辅助索引
在MyISAM中主键索引和辅助索引的结构是一样的,在MyISAM中索引文件和数据是分开的因此称为非聚集索引.MyISAM中B+Tree的叶子节点存是数据是具体数据的指针值。查询的时候,通过索引树找到对应的节点,通过索引节点中存储的记录指针找到数据文件中对应的记录。上图中的索引树就存在之前说的索引文件(myi)中,具体的数据存储在数据文件(myd)中。
聚集索引(Innodb)
Innodb使用的是聚集索引,索引和数据都存在ibd文件中,看下具体的存储结构。