存储引擎

Mysql 有几种存储引擎:

  • MyISAM
  • InnoDB
  • MERGE
  • MEMORY(HEAP)

其中,MySQL 5.1 之前默认使用 MyISAM 引擎,5.1 之后默认使用 InnoDB

下面说说,InnoDB 和 MyISAM:

区别:

特点 MyISAM InnoDB
存储限制 64TB
事务 不支持 支持
锁机制 表锁 行锁
哈希索引 不支持 支持
全文索引 支持 不支持(5.6.4 开始支持)
外键 不支持 支持
内存与空间使用 较低 较高

相同:

特点 MyISAM InnoDB
B 树索引 支持 支持
索引缓存 支持 支持

索引

在 MySQL 中,常用的有两种,一种是哈希索引,一种是 B+ Tree

1. B+ 树索引原理

数据库最广泛使用的索引数据结构,同时也是 InnoDB 默认索引实现方式

B+ Tree 是基于 B Tree 改进来的一种平衡树,本质没什么不同,就是叶子结点多了顺序访问指针,因此,它可以通过顺序访问指针来提高区间查询的性能

B+ Tree 的一个结点中的 key,从左到右,按照从小到大(或等于)排列

查找的时候,按照二分查找,插入删除需要进行分裂、合并、旋转操作调整平衡

比起 B 树,B+ 树把数据存在叶子结点,所有分支结点为索引,所以 B+ 树的结点要小的多,同时由于磁盘 IO 一次读出数据量是固定的,单位结点小了,那么整体 IO 次数也会更少;而且由于只在叶子结点存储数据,那么只需查找索引后在比较小的区间内查找值,查找更加高效了

比起红黑树,B+ 树的高度要矮的多,那么使用 B+ 树当索引时,它是存放在磁盘上的,如此对 B+ 树索引查找,IO 次数会比红黑树少的多

利用磁盘预读原理:一个结点大小设置为一个页大小,一次 IO 既可读出一个结点;因为磁盘预读的速度代价小的多,所以每次这样设置页大小,能使得数据相邻结点预先载入

聚簇索引与非聚簇索引:B+ 树实现的索引,分为主索引与辅助索引

  • 对于 InnoDB,主索引属于聚簇索引,辅助索引属于非聚簇索引
  • 对于 MyISAM,无论是哪种索引都属于非聚簇索引

两种索引区别就是,聚簇索引将数据直接存储再索引中(叶子结点的 data 域)这样会大大减少 IO 次数

2. 哈希索引原理

O(1) 时间的查找,但失去了有序性,同时无法做到 B+ 树那样的部分查找和范围查找

InnoDB 有一个特性叫“自适应哈希索引”,当某个索引值呗频繁使用,就会在 B+ 树上再建立一个哈希索引