B+树 | MySQL索引使用原则
如图所示,假如要查找数据项29,那么起首会把磁盘块1由磁盘加载到内存,此时产生一次IO,在内存顶用二分查找确定29在17和35之间,锁定磁盘块1的P2指针,内存时刻由于很是短(对比磁盘的IO)可以忽略不计,通过磁盘块1的P2指针的磁盘地点把磁盘块3由磁盘加载到内存,产生第二次IO,29在26和30之间,锁定磁盘块3的P2指针,通过指针加载磁盘块8到内存,产生第三次IO,同时内存中做二分查找找到29,竣事查询,总计三次IO。真实的环境是,3层的b+树可以暗示上百万的数据,假如上百万的数据查找只必要三次IO,机能进步将是庞大的,假如没有索引,每个数据项都要产生一次IO,那么总共必要百万次的IO,显然本钱很是很是高。 b+树性子 1、通过上面的说明,我们知道IO次数取决于b+数的高度h,假设当前数据表的数据为N,每个磁盘块的数据项的数目是m,则有h=㏒(m+1)N,当数据量N必然的环境下,m越大,h越小;而m = 磁盘块的巨细 / 数据项的巨细,磁盘块的巨细也就是一个数据页的巨细,是牢靠的,假如数据项占的空间越小,数据项的数目越多,树的高度越低。这就是为什么每个数据项,即索引字段要只管的小,好比int占4字节,要比bigint8字节少一半。这也是为什么b+树要求把真实的数据放到叶子节点而不是内层节点,,一旦放到内层节点,磁盘块的数据项会大幅度降落,导致树增高。当数据项便是1时将会退化成线性表。 2、当b+树的数据项是复合的数据布局,好比(name,age,sex)的时辰,b+数是凭证从左到右的次序来成立搜刮树的,好比当(张三,20,F)这样的数据来检索的时辰,b+树会优先较量name来确定下一步的所搜偏向,假如name沟通再依次较量age和sex,最后获得检索的数据;但当(20,F)这样的没有name的数据来的时辰,b+树就不知道下一步该查哪个节点,由于成立搜刮树的时辰name就是第一个较量因子,必必要先按照name来搜刮才气知道下一步去那边查询。好比当(张三,F)这样的数据来检索时,b+树可以用name来指定搜刮偏向,但下一个字段age的缺失,以是只能把名字便是张三的数据都找到,然后再匹配性别是F的数据了, 这个长短常重要的性子,即索引的最左匹配特征。 慢查询优化 关于MySQL索引道理是较量死板的对象,各人只必要有一个感性的熟悉,并不必要领略得很是透彻和深入。我们转头来看看一开始我们说的慢查询,相识完索引道理之后,各人是不是有什么设法呢?先总结一下索引的几大根基原则 四、建索引的几大原则1、最左前缀匹配原则,很是重要的原则,mysql会一向向右匹配直到碰着范畴查询(>、<、between、like)就遏制匹配,好比a = 1 and b = 2 and c > 3 and d = 4 假如成立(a,b,c,d)次序的索引,d是用不到索引的,假如成立(a,b,d,c)的索引则都可以用到,a,b,d的次序可以恣意调解。 2、=和in可以乱序,好比a = 1 and b = 2 and c = 3 成立(a,b,c)索引可以恣意次序,mysql的查询优化器会帮你优化成索引可以识此形状式 3、只管选择区分度高的列作为索引,区分度的公式是count(distinct col)/count(*),暗示字段不一再的比例,比例越大我们扫描的记录数越少,独一键的区分度是1,而一些状态、性别字段也许在大数据眼前区分度就是0,那也许有人会问,这个比例有什么履历值吗?行使场景差异,这个值也很难确定,一样平常必要join的字段我们都要求是0.1以上,即均匀1条扫描10笔记录 4、索引列不能参加计较,保持列“干净”,好比from_unixtime(create_time) = ’2014-05-29’就不能行使到索引,缘故起因很简朴,b+树中存的都是数据表中的字段值,但举办检索时,必要把全部元素都应用函数才气较量,显然本钱太大。以是语句应该写成create_time = unix_timestamp(’2014-05-29’); 5、只管的扩展索引,不要新建索引。好比表中已经有a的索引,此刻要加(a,b)的索引,那么只必要修改原本的索引即可 【编辑保举】
点赞 0 (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |