mysql 的索引和引擎

mysql的数据都是存放在磁盘上的,都说索引会使查询变快,那么肯定是索引用了特殊的数据结构。

常见的数据结构有:

  1. hash
    hash就是咱们在hashMap中的那个hash,用hash确实快,而且时间复杂度是O(1),但是hash不适合范围查询,所以索引的主要数据结构应该不是hash。
  2. 二叉树
    普通二叉树作为最初的树形结构,确实在某些情况下就很快了,但是由于对于自增id这种索引,二叉树会极度倾斜,最差的情况就是一条枝,所以也不适合做索引的结构。
  3. 红黑树
    同理,红黑树在平衡上做了改进,但是针对自增id这种索引,在数据量很大的情况下,仍然会出现整体右倾的状况,所以红黑树也不是很适合。
  4. B+tree
    对,就剩B+tree了,由于这个树的设计原因,他会极度平衡,所以结论就是索引用的数据结构就是他。

mysql 常见的引擎

  1. MyISAM引擎 (非聚集索引方式)
    查询性能极佳,但不支持事务
  2. INNODB引擎(聚集索引方式)
    查询性能稍逊MyISAM,但支持事务
为什么MyISAM引擎会比INNODB引擎查询性能还快

这个要从存储文件来看,分别设置两种引擎,存储相同的数据,我们在本地测试的时候会发现两种引擎有不同的文件存储。

  1. INNODB引擎
    .frm:存储表的结构
    .ibd:存储表的索引和内容
  2. MyISAM引擎
    .frm:存储表的结构
    .MYD:存储表的内容
    .MYI:存储表的索引

我们可以从上面的对比看出,MyISAM对于表的内容和索引是分开存储的,而INNODB是在一个文件存储的,简单理解,同样的内容和索引,合在一起存储,那么这个文件必然就会比较大,相比MyISAM引擎的 .MYI来说,所以文件越大,那么查询就会越慢。

而且,从上面的对比也能看出,INNODB引擎存储表的索引和内容,是一个文件,这也是为什么他能支持事务的一个原因,而MyISAM引擎对于索引和内容是分开的,所以这也是他不支持事务的一个原因吧。