mysql 的索引和引擎
mysql的数据都是存放在磁盘上的,都说索引会使查询变快,那么肯定是索引用了特殊的数据结构。
常见的数据结构有:
-
hash
hash就是咱们在hashMap中的那个hash,用hash确实快,而且时间复杂度是O(1),但是hash不适合范围查询,所以索引的主要数据结构应该不是hash。 -
二叉树
普通二叉树作为最初的树形结构,确实在某些情况下就很快了,但是由于对于自增id这种索引,二叉树会极度倾斜,最差的情况就是一条枝,所以也不适合做索引的结构。 -
红黑树
同理,红黑树在平衡上做了改进,但是针对自增id这种索引,在数据量很大的情况下,仍然会出现整体右倾的状况,所以红黑树也不是很适合。 -
B+tree
对,就剩B+tree了,由于这个树的设计原因,他会极度平衡,所以结论就是索引用的数据结构就是他。
mysql 常见的引擎
- MyISAM引擎 (非聚集索引方式)
查询性能极佳,但不支持事务 - INNODB引擎(聚集索引方式)
查询性能稍逊MyISAM,但支持事务
为什么MyISAM引擎会比INNODB引擎查询性能还快
这个要从存储文件来看,分别设置两种引擎,存储相同的数据,我们在本地测试的时候会发现两种引擎有不同的文件存储。
- INNODB引擎
.frm:存储表的结构
.ibd:存储表的索引和内容 - MyISAM引擎
.frm:存储表的结构
.MYD:存储表的内容
.MYI:存储表的索引
我们可以从上面的对比看出,MyISAM对于表的内容和索引是分开存储的,而INNODB是在一个文件存储的,简单理解,同样的内容和索引,合在一起存储,那么这个文件必然就会比较大,相比MyISAM引擎的 .MYI来说,所以文件越大,那么查询就会越慢。
而且,从上面的对比也能看出,INNODB引擎存储表的索引和内容,是一个文件,这也是为什么他能支持事务的一个原因,而MyISAM引擎对于索引和内容是分开的,所以这也是他不支持事务的一个原因吧。