一、存储引擎
mysql的引擎主要有以下几种:innodb,MyIsam,Memory,它们的侧重点各不相同
1、innodb
innodb是一个事务级别的存储引擎,因为支持事务,所以需要锁定要操作的元素,那么这个元素就不能过大,目标是全表?那肯定不行,所以innodb支持行级别的锁,这样就能保证高并发的时候的的效率更高
2、MyIsam
MyIsam是mysql的默认存储引擎,但是它不支持事务,因此在执行写操作(即插入或更新)时会锁住全表
3、Memory
二、索引
索引能够加快搜索,因为通常会只遍历符合索引的内容,所以大大减少了遍历的内容,但是索引作为一种数据结构,在不通的引擎中的应用也是不同的。
首先需要知道一点,文件系统的目录索引等都不会使用红黑树,AVL树等看似也很高效的结构,因为文件系统时放在磁盘中的而不是内存,磁盘相比内存最大的缺点就是IO的速度,磁盘需要寻道和旋转,物理上的速度很慢。另外红黑树等逻辑上的父子节点在物理上可能隔得很远,更加剧了效率的降低。
那么mysql索引使用的是什么结构呢,他们使用的都是B+树,其实B-树的效率也差不多,但是B-树因为将数据放在了中间节点中,所以索引包含的文件更大,查找的时间会稍微长一些,想要知道B+-树的区别可以看我的另一篇文章数据结构-树
虽然MyIsam和innodb都是使用B+树,但是在使用上还是有所不同的。
MyIsam在叶子节点的data中存放的是数据的地址,因此也叫“非聚集”的索引,那么innodb就是“聚集”索引,它的叶子节点的data中存放的就是数据。
innodb的数据放在节点中,因此innodb的索引是按照主键聚集的,那么innodb就要求必须要有主键,而MyIsam可以不用主键。
在索引的分类中,我们可以按照索引的键是否为主键来分为“主索引”和“辅助索引”,使用主键键值建立的索引称为“主索引”,其它的称为“辅助索引”。因此主索引只能有一个,辅助索引可以有很多个。
MyIsam只用辅助索引时,只需要一次遍历就可以得到地址,而innodb如果使用辅助索引的话,其实是先遍历辅助索引,因为它的辅助索引的data是主键,所以需要再次遍历主索引得到数据,所以主键尽量不要太长并且是单调的。单调的好处是在B+树的底层插入操作的时候可以直接加在最后,而不用放进中间导致需要分裂等等问题。
网友评论