MySQL存储引擎如何选择,索引如何选择,索引的数据结构?

对于MySQL存储引擎、索引类型的选择可能大多数时候无脑选InnoDB就行了,但是理论上存储引擎的选择应该综合考量事务安全、并发量、支持的索引类型等因素。

同样对于索引类型的选择虽然大多数情况下选B树索引就完事了,但是B树索引并非在任何情况下都是最优的,某些业务场景下可能选全文索引或者哈希索引更加合适。这也是面试中经常问到的基础题。

本文主要内容是参考了MySQL官方文档和其他网站内容结合自己的理解总结而成,希望能帮到大家,如果觉得有收获记得关注哦!

1.1. <strong>MySQL存储引擎

1.1.1. <strong>存储引擎特性

参考链接:https://dev.mysql.com/doc/refman/5.7/en/storage-engines.html

下面以MySQL5.7为准,列举了4个主要存储引擎的特性对比(对MySQL官方文档进行了顺序调整和删减):

MySQL存储引擎如何选择,索引如何选择,索引的数据结构?

备注: MySQL5.6+ InnoDB支持全文索引。

1.1.2. <strong>存储引擎应用场景

参考链接:

https://mp.weixin.qq.com/s/Yjh_fPgrjuhhOZyVtRQ-SA

https://blog.csdn.net/zhangyuan19880606/article/details/51217952

MySQL 5.5+的默认存储引擎为InnoDB, 之前为MyISAM。

InnoDB和MyISAM默认的索引都是B树索引,Memory默认的索引是哈希索引。

InnoDB支持事务,支持行级锁,支持数据缓存,支持聚集索引,适用于大部分并发量大、数据量大的业务系统。

MyISAM拥有较高的插入、查询速度,但不支持事物,适用于数据仓库等场景。

MEMORY将表中的数据存储到内存中,且支持哈希索引,因此精确查询的速度较快,适用于数据量较小、对查询速度要求较高的场景。

Archive插入较快,适合存储归档数据,如日志信息。

2. <strong>索引

2.1. <strong>索引原理

2.1.1. <strong>索引基础

参考链接:https://tech.meituan.com/mysql_index.html

图书馆为了提高查找书籍的效率需要为书籍建立索引,数据库为了提高数据的查询效率也需要为数据建立索引。但数据库索引要复杂许多,因为不仅要考虑等值查询,还有多条件查询(and)、范围查询(>、

一般访问磁盘的成本大概是访问内存的十万倍左右。

一般文件系统为了提高磁盘访问效率,当一次IO时,会把相邻的数据也都读取到内存缓冲区内(局部预读性原理告诉我们,当计算机访问一个地址的数据的时候,与其相邻的数据也大概率会被访问到),然后再进行查找。

2.2. <strong>索引数据结构

2.2.1. <strong>B+树索引

参考文献:《MySQL技术内幕-InnoDB存储引擎第2版》

B+树(binary plus tree)是从平衡二叉树(左子树的键值小于根节点的键值,右子树的键值大于根节点的键值)演化而来,但B+树并不是二叉树。B+树被广泛应用于文件系统、数据库中建立索引。

B+树的简单定义:B+树是为磁盘或其他存储设备设计的一种平衡查找树。B+树中所有记录都是按键值大小顺序存放在叶子节点上,各叶子节点通过指针进行连接。

数据库中B+树的高度一般为2~4。InnoDB中B树索引页大小为16KB。

通过B树索引查找数据时的IO次数取决于b+树的高度h,假设当前数据表的数据为N,每个磁盘块的数据项的数量是m,则有h=log (m+1)N。即B+树的高度取决于表的数据量和磁盘块的大小。

B+树的数据结构示意图如下(其中P代表指针):

MySQL存储引擎如何选择,索引如何选择,索引的数据结构?

2.2.2. <strong>哈希索引

哈希索引(Hash indexes)采用哈希表来对键值进行查找,时间复杂度为O(1)。

使用哈希索引时对于键值的等值查询是非常快的,但是其他类型的查询如范围查询、模糊查询、排序等是不能使用哈希索引的。这是哈希索引使用比较少的主要原因。

2.2.3. <strong>全文索引

对于 select * from blog where content like '%java%'是无法使用B树索引的。在电商网站中如果要对商品的明细进行关键字查询,则需要使用全文索引。

全文索引查找条件使用 MATCH AGAINST。

全文索引(Full-text search indexes)使用倒排索引(inverted index)实现。倒排索引会记录文本中的每个关键字出现在文档中的位置。

2.3. <strong>索引分类

参考链接:

https://dev.mysql.com/doc/refman/5.7/en/innodb-index-types.html

https://www.2cto.com/kf/201602/490519.html

2.3.1. <strong>聚集索引

聚集索引(Clustered Index)又称聚簇索引,其叶子节点存放记录。

每个InnoDB 表有一个特定的索引叫做聚集索引,存储行的数据。

如果你的表定义了主键那么主键就是聚集索引,如果没有定义主键,MySQL 会选择第一个非空唯一索引列作为聚集索引,如果表中也没有唯一索引,InnoDB会生成一个类似RowId的隐藏的聚集索引。

2.3.2. <strong>二级索引

二级索引(secondary indexes)又称辅助索引、非聚簇索引,其叶子节点存放索引值及指向主键的指针。

除聚集索引以外的索引,统称为二级索引,如唯一索引、普通索引、组合索引等。


分享到:


相關文章: