vlambda博客
学习文章列表

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),因此所有的数据都要查询至叶子节点,而叶子节点的高度都是相同的,因此所有数据的查询速度都是一样的