Mysql索引分类及实现原理
索引分类:主键索引、唯一索引、普通索引、全文索引、组合索引
索引类型:如BTree索引,B+Tree索引,哈希索引,全文索引
HASH索引:只有memory(内存)存储引擎支持哈希索引,哈希索引用索引列的值计算该值的hashCode,然后在hashCode相应的位置存执该值所在行数据的物理位置,因为使用散列算法,因此访问速度非常快,但是一个值只能对应一个hashCode,而且是散列的分布方式,因此哈希索引不支持范围查找和排序的功能
全文索引:FULLTEXT(全文)索引,仅可用于MyISAM和InnoDB,针对较大的数据,生成全文索引非常的消耗时间和空间。对于文本的大对象,或者较大的CHAR类型的数据,如果使用普通索引,那么匹配文本前几个字符还是可行的,但是想要匹配文本中间的几个单词,那么就要使用LIKE %word%来匹配,这样需要很长的时间来处理,响应时间会大大增加,这种情况,就可使用时FULLTEXT索引了,在生成FULLTEXT索引时,会为文本生成一份单词的清单,在索引时及根据这个单词的清单来索引。5.6版本之后InnoDB存储引擎开始支持全文索引。5.7版本之后通过使用ngram插件开始支持中文
SELECT * FROM table_name MATCH(ft_index) AGAINST('查询字符串');
BTree索引:在BTree的结构下,使用二分查找的查找方式,查找复杂度为h*log(n),一般来说树的高度是很小的,一般为3左右,因此BTree是一个非常高效的查找结构
每个叶子结点的高度一样,等于h;
每个非叶子结点由n-1个key和n个指针point组成,其中d<=n<=2d,key和point相互间隔,结点两端一定是key;
叶子结点指针都为null;
非叶子结点的key都是[key,data]二元组,其中key表示作为索引的键,data为键值所在行的数据
B+Tree索引:
B+Tree中的非叶子结点不存储数据,只存储键值;
B+Tree的每个非叶子节点由n个键值key和n个指针point组成
B+Tree根BTree有点在于两点:
磁盘读写代价更低:
B+Tree的非叶节点中不存储data,就可以存储更多的key,减少了IO
查询速度更稳定:
由于B+Tree非叶子节点不存储数据(data),因此所有的数据都要查询至叶子节点,而叶子节点的高度都是相同的,因此所有数据的查询速度都是一样的