这是2014北京站的两副面孔阿里实习生问题扯在一起:
在MySQL中。索引属于存储引擎级别的概念,不同存储引擎对索引的实现方式是不同的,比方MyISAM和InnoDB存储引擎。
MyISAM索引实现:
MyISAM存储引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址。
MyISAM的索引方式也叫做“非Ju集”的。之所以这么称呼是为了与InnoDB的ju集索引区分。
InnoDB索引实现:
尽管InnoDB也使用B+Tree作为索引结构,但详细实现方式却与MyISAM截然不同。
第一个重大差别是:InnoDB的数据文件本身就是索引文件。
第二个与MyISAM索引的不同是:InnoDB的辅助索引data域存储对应记录主键的值而不是地址。ju集索引这样的实现方式使得按主键的搜索十分高效,可是辅助索引搜索须要检索两遍索引:首先检索辅助索引获得主键。然后用主键到主索引中检索获得记录。
事实上,数据库索引的实现能够採用红黑树。B-Tree树数据结构。
可是为什么实际上採用的B+Tree呢?
这要从计算机存储原理和操作系统相关知识说起。
由于数据表的索引比較大。不能常驻内存,所以以文件形式存储在磁盘中。所以当查询数据的时候就须要I/O操作。
高效率查询的目标是较少I/O次数。
一次I/O一般读取一页(一般为4k)大小的数据(局部性原理)。
如此,在B-树中,每当申请一个新结点时,就以页的大小来申请。也就是说一次I/o能够读取一个一个结点(包括非常多key)的数据。而在红黑树结构结构中。逻辑相邻的结点物理上不一定相邻,就是说,读取同等的数据须要多次I/O。
所以选择B-树效率更好。
那为何终于选了B+树呢?
由于B+树内节点去掉了data域,因此能够拥有更大的出度,就是说一个结点能够存储很多其它的内结点,那么I/O效率更高。
了解不同存储引擎的索引实现方式对于正确使用和优化索引都非常有帮助,比如知道了InnoDB的索引实现后,就非常easy明确为什么不建议使用过长的字段作为主键,由于全部辅助索引都引用主索引。过长的主索引会令辅助索引变得过大。再比如,用非单调的字段作为主键在InnoDB中不是个好主意。由于InnoDB数据文件本身是一颗B+Tree,非单调的主键会造成在插入新记录时数据文件为了维持B+Tree的特性而频繁的分裂调整,十分低效,而使用自增字段作为主键则是一个非常好的选择。
ju集索引与非ju集索引之分:
InnoDB是ju集索引,由于它的B+树的叶结点包括了完整的数据记录。
而MyISAM方式B+树的叶结点仅仅是存储了数据的地址。故称为非ju集索引。
索引使用策略及优化
MySQL的优化主要分为结构优化(Scheme optimization)和查询优化(Query
optimization)。详情查看此文:
注:聚,都用ju取代,ju集竟然是敏感词。太坑了。求破解方法
版权声明:本文博客原创文章。博客,未经同意,不得转载。