当前位置: 首页 > 科技观察

B+树-MySQL索引使用原理

时间:2023-03-13 17:36:01 科技观察

MySQL一直以来了解不多。在写sql准备提交到生产环境之前,老员工帮我检查了sql,让我修改存储引擎。当时用的是Myisam,后来改用InnoDB。为什么要改成这个?之前没听说过存储引擎,于是上网查了一下。其实使用不同的存储引擎是有很大区别的,看下面就知道了。1、存储引擎的比较注:上面提到的B-tree索引并不是说它是B-Tree和B+Tree索引,而是B-tree和B+树的定义不同。在MySQL中,主要有四种索引,分别是:B-Tree索引、Hash索引、Fulltext索引和R-Tree索引。B-Tree索引是MySQL数据库中最常用的索引类型,除了Archive存储引擎之外的所有存储引擎都支持B-Tree索引。Archive引擎直到MySQL5.1才支持索引,并且只支持索引单个AUTO_INCREMENT列。不仅在MySQL中,实际上在很多其他数据库管理系统中,B-Tree索引也是最重要的索引类型,主要是因为B-Tree索引的存储结构在数据库的数据检索中起着重要的作用.很好的表现。一般来说,MySQL中B-Tree索引的物理文件大部分存储在BalanceTree的结构中,即实际需要的所有数据都存储在Tree的LeafNode中,任意一个Leaf的长度Node的最短路径完全一样,所以我们都称它为B-Tree索引。当然,各种数据库(或者MySQL的各种存储引擎)在存储自己的B-Tree索引时,可能会稍微修改一下存储结构。例如Innodb存储引擎的B-Tree索引实际使用的存储结构实际上是B+Tree,即在B-Tree数据结构的基础上做了一个小的修改,存储索引键在每个LeafNode上除了保存LeafNode的相关信息外,还保存了指向与LeafNode相邻的下一个LeafNode的指针信息(增加了顺序访问指针),主要是出于加快效率的考虑检索多个相邻的叶节点。InnoDB是Mysql(Mysql5.5.5之前的MyISAM)默认的存储引擎。对索引一无所知的猿友可能很难看懂这篇文章。需要这样的猿友对Mysql索引有一个大概的了解。可以看另一篇文章:数据库查询优化-Mysql索引http://blog.csdn.net/u013142781/article/details/51424174看完这篇文章,我们回过头来看看上面的文字说明。接下来,我们来看看B-tree和B+树的概念。弄清楚为什么加索引会加快查询速度?二、B-tree、B+树的概念B-tree是二叉搜索树:1.所有非叶子节点至多有两个儿子(Left和Right);2.All节点存储一个关键字;3、非叶子节点的左指针指向比其关键字小的子树,右指针指向比其关键字大的子树;如:B-tree是一棵多路搜索树(且不是二叉树):1.定义任意一个非叶子节点至多有M个儿子;M>2;2、根节点的儿子个数为[2,M];3.除根节点以外的非叶节点该点的儿子个数为[M/2,M];4、每个节点至少存储M/2-1(向上取整)最多M-1个关键字;(至少2个关键字)5.非-叶子节点的关键字数=指向sons-1的指针数;6.非叶子节点的关键字:K[1],K[2],...,K[M-1];K[i],<,between,like)然后停止匹配,比如a=1andb=2andc>3andd=4如果建立(索引按a,b,c,d的顺序)不用于d。如果建立了(a,b,d,c)的索引,就可以使用了。a、b、d的顺序可以任意调整。2.=andin可以乱序,比如a=1andb=2andc=3。(a,b,c)索引可以任意顺序创建,mysql的查询优化器会帮你优化成索引可以识别的形式3、尽量选择鉴别度高的列作为索引。区分度的公式为count(distinctcol)/count(*),表示字段不重复的比例。比例越大,我们扫描的记录就越少,uniquekey的判别度为1,而一些status和gender字段在大数据面前可能判别度为0。那么可能有人会问,这个比例有没有经验值呢?在不同的使用场景下很难确定这个值。一般我们需要加入字段。两者都要求在0.1以上,即平均每次扫描10条记录4.索引列不能参与计算,保持列“干净”,如from_unixtime(create_time)='2014-05-29',不能使用索引,原因很简单,数据表中的所有字段都存储在b+树中,但是在查找的时候,需要对所有元素应用函数进行比较,显然代价太大。所以语句应该写成create_time=unix_timestamp('2014-05-29');5、尽量扩展索引,不要新建索引。比如表中已经有a的索引,现在要增加(a,b)的索引,那么只需要修改原来的索引即可

猜你喜欢