mysql索引和索引和explain的详解的详解
索引原理分析索引原理分析
索引存储结构索引存储结构
索引是在存储引擎中实现的,也就是说不同的存储引擎,会使使用不同的索引
MyISAM和InnoDB存储引擎:只支持B+ TREE索引, 也不能够更换
MEMORY/HEAP存储引擎:支持HASH和BTREE索引
B树图示树图示
B树是为了磁盘或其它存储设备设计的一种多叉(下面你会看到,相对于二叉,B树每个内结点有多个分支,即多叉)平衡查找树。 多叉平衡。
B树和树和B+树的区别:树的区别:
B树和B+树的最大区别在于非叶子节点是否存储数据的问题
在结构上:在结构上:
(1) B树是非也只节点和叶子节点都会存储数据。
(2) B+树只有叶子节点才会存储数据,而且数据都是在一行上,而且这些数据都是指针指向的,也是有顺序的。
在性能上:在性能上:
(1)对于B-树相对于B+数据,B-Tree因为非叶子结点也保存具体数据,所以在查找某个关键字的时候找到即可返回。而B+Tree所有的数据都在叶子结点,每次查
找都得到叶子结点。所以在同样高度的B-Tree和B+Tree中,B-Tree查找某个关键字的效率更高。B-Tree在单条数据读写有着更强的性能。
(2)但由于B+Tree所有的数据都在叶子结点,并且结点之间有指针连接,在找大于某个关键字或者小于某个关键字的数据的时候,B+Tree只需要找到该关键字然
后沿着链表遍历就可以了,而B-Tree还需要遍历该关键字结点的根结点去搜索。这个也决定当连表查询的时候mysql比起mongo有显著的优势。更重要的是由于B-
Tree的每个结点(这里的结点可以理解为一个数据页)都存储主键+实际数据,而B+Tree非叶子结点只存储关键字信息,而每个页的大小有限是有限的,所以同一
页能存储的B-Tree的数据会比B+Tree存储的更少。这样同样总量的数据,B-Tree的深度会更大,增大查询时的磁盘I/O次数,进而影响查询效率。
聚集索引(聚集索引(MyISAM))
B+树叶节点只会存储数据行(数据文件)的指针,简单来说数据和索引不在一起,就是聚集
索引。
聚集索引包含主键索引和辅助索引都会存储数据指针的值。