1,mysql的搜索引擎常用的有两种MyISAM和InnoDB,那么我问大家一个问题,搜索引擎是作用于表还是作用于数据库呢?如果你真的不知道我建议你打开自己的表看一下,看下表的结构就明白了。
那么这两个搜索引擎具体有什么区别呢,我们找到自己的mysql的安装目录看下里面的结构,
我们从上图可以看到搜索引擎为MyISAM的表包含.frm,.MYD,.MYI。而搜索引擎为InnoDB的表包含.frm和.ibd两个文件,那么这几个文件分别代表什么呢?这个问题先放到这我们转一个话题,先了解一下mysql索引的常用的数据结构,看懂了这几个数据结构,再结合搜索引擎我们就明白了。
索引是什么呢?
是帮助mysql高效获取排好序的数据结构(最简单明了)
索引的数据结构包含哪些?
二叉树,红黑树,hash(看下mysql在创建索引的时候选择索引类型的时候有这一个选项),B-Tree,B+Tree,相信能有耐心想看完这遍文章的就是想彻底了解搜索引擎和索引之间的关系,以及索引数据结构的,不要告诉我这几个数据结构没听过,什么是红黑树不知道的话建议去看下jdk1.8的hashmap的数据结构理解。https://www.cs.usfca.edu/~galles/visualization/Algorithms.html这个网站是数据结构可视化用的,建议你收藏。
为什么我们的索引不用二叉树呢,因为二叉树有可能退化成链表结构结构,那么查询效率就将会收到极大的限制,红黑树是一个自平衡二叉树,我们用到的B-Tree是对二叉树进行了横向的扩展,为什么这么说呢,我的B-Tree或者B+Tree存储的都是一组索引或者一组索引加上数据data,一个节点大概可以存储16k,一般的索引是int或者bigint那么就可以一个节点存储16kb/14b=1170个数据,那么h=3高度的就可以存储最多为1170*1170*16大概为2千万数据量,一个16k的数据在进行磁盘io的时候是很快的,所以加了索引以后2千万的数据也就用几百秒。
B-tree的数据结构
字体写的不太好看,能看懂就行,叶子节点的指针为空
mysql选择B+Tree是B-Tree的变种,两者比较有什么区别呢?我们讲完本节希望你能自己得出结论,
B+Tree的特点
1,非叶子节点不存储data,只存储索引(冗余)索引字段在节点间有重复,看下 B-Tree有没有这个重复的现象,当然没有
2,非叶子节点包含所有的索引字段,B-Tree则包含索引对应的data字段
3,叶子节点用指针链接,提高区间的访问性能,我们在做业务开发的时候进行区间查询是常用的,B+Tree进行区间查询的效率要比B-Tree高很多,看下图如果查询18到39之间的数据的话,B-Tree需要回到根节点重新遍历一遍,而B+Tree叶子节点之间有指针可以直接查询。并且节点存储的是索引比B-Tree可以更多的存储
好了数据结构这块相信你理解了如果不理解可以留言。
那么我们回到之前的问题有关搜索引擎分别为MyISAM和InnoDB的存储数据索引的了解,我们先来看下MyISAM,上面提到了三个文件如果你忘了建议回去看一下叫什么,最好看下自己的安装目录的内容。
上面为们可以看出MyISAM索引文件和数据文件是分离的所以我们称为非聚集索引,data存储的是索引所在元素的磁盘地址指针,我们会根据这个磁盘地址指针回查表。从上图的标志我们可以看到MYI和MYD分别指的是mysql的index 和mysql的data.那么也不难理解innodb的文件.idb是索引文件和data文件的组合也称为聚集索引
我们需要了解一下Innodb必须有逐渐因为数据结构的要求,如果建表的时候没有主键,那么innodb会自动给你创建使用uuid,我们不建议innodb自己创建的希望用整形自增的,因为我们在查索引数据结构的时候会进行索引大小的比较,如果为UUID,则数据就比较大,比较起来比较慢。
我们简单补充一下联合索引的底层存储结构长什么样子?
那么我们的索引有hash数据结构,查找单个数特别块但是不支持范围的查找,B+Tree在范围查找做的特别好,叶子节点带双向链接,B-Tree则在范围查找的时候很大可能需要重复从根节点查速度会特别慢。