这是我参与「第五届青训营 」伴学笔记创作活动的第 16 天
在大作业中,我们使用到了MySQL,并需要考虑索引的建立。这里对MySQL索引的相关学习做一个记录。
B+树索引
mysql索引分为下面三种:B+树索引,全文索引,哈希索引。
B+树索引基于B+树实现,树的高度一般在2-4层,B+树的叶子节点记录数据,非叶子节点记录索引。
值得注意的是,由于B+树的叶子节点是双向链表指针,而且是按照顺序相连,这意味着如果在中间进行插入或者删除操作,就可能会对叶子节点进行拆分和和合并,而索引数据是存在磁盘上的,页的拆分意味着磁盘操作,所以应该尽可能减少页的拆分操作,这也是主键索引推荐使用自增的原因。
全文索引
全文索引主要用于对字段进行局部搜索,例如,某个字段的内容为"talk to myself",如果我们想通过"talk"进行查找,可以使用like "talk%",也可以使用全文索引,但是全文索引要比like快很多,全文索引的原理是倒排索引,对每个单词记录所在的文档ID,还会存储单词所在文档中ID的具体位置。
遗憾的是全文索引只支持英文,并且只能匹配单词,单词中的某几个字母是不能匹配的。
哈希索引
哈希索引的原理与HashMap一样,对每个索引值计算哈希并保存,下次查询的时候就先计算出对应的哈希,然后直接去找对应的数据。
他的好处是查询非常快,查询时间复杂度最快可以达到O(1),但是弊端也很明显,如下:
- 哈希索引无法用于排序
- 哈希索引不支持部分查找
- 哈希索引不支持比较操作
- 哈希冲突会影响查询速度,最坏的情况下哈希表会降为链表,查询时间复杂度最高O(n)