• b+树的查找过程:如上图所示,如果要查找数据项29,那么首先会把磁盘块1由磁盘加载到内存,此时发生一次IO,在内存中用二分查找确定29在17和35之间,锁定磁盘块1的P2指针,
                                      内存时间因为非常短(相比磁盘IO)可以忽略不计,通过磁盘块1的P2指针的磁盘地址把磁盘块3由磁盘加载到内存,发生第二次IO,29在26和30之间,锁定磁盘块
                                      3的P2指针,通过指针加载磁盘块8到内存,发生第三次IO,同时内存中做二分法查找找到29,结束查询,总计三次IO。真实的情况是,3层的b+树可以表示上百万
                                      的数据。
  • b+树的性质:
    • IO次数取决于b+树额高度h,假设当前数据表的数据为N,每个磁盘块的数据项的数量是m。则有h=log(m+1)N,当数据量N一定的情况下,m越大,h越小;而m=磁盘块的大小/数
      据项的大小,磁盘块的大小也就是一个数据页的大小,是固定的,如果数据项占的空间越小,数据项数量越多,树的高度越低。这就是为什么每个数据项,即索引字段要尽量的小,
      也是为什么b+树要求把真实数据放到叶子节点而不是内层节点,一旦放到内层节点,磁盘块的数据项会大幅度下降,导致树增高。
    • 当b+树的数据项是复合的数据结构,比如(name,age,sex)的时候,b+树是按照从左到右的顺序来建立搜索树的,比如当(张三,20,F)这样的数据来检索的时候,b+树会优
      先比较name确定下一步的搜索方向,如果name相同再依次比较age和sex,最后得到检索的数据。索引的最左匹配属性。
  • 建索引的几大原则:
    • 最左前匹配原则
    • =和in可以乱序
    • 尽量选择区分度高的列作为索引,区分度的公式是count(distinct col)/count(*),表示字段不重复的比例,比例越大我们扫描的记录数越少
    • 索引列不能参与计算
    • 尽量的扩展索引,不要新建索引
  • 慢查询优化基本步骤:

0.先运行看看是否真的很慢,注意设置SQL_NO_CACHE
1.where条件单表查,锁定最小返回记录表。这句话的意思是把查询语句的where都应用到表中返回的记录数最小的表开始查起,单表每个字段分别查询,看哪个字段的区分度最高
2.explain查看执行计划,是否与1预期一致(从锁定记录较少的表开始查询)rows
3.order by limit 形式的sql语句让排序的表优先查
4.了解业务方使用场景
5.加索引时参照建索引的几大原则
6.观察结果,不符合预期继续从0分析

转载于:https://www.cnblogs.com/jdktomcat/p/10252362.html

数据库索引的数据结构b+树相关推荐

  1. 为什么MySQL数据库索引选择使用B+树?

    在进一步分析为什么MySQL数据库索引选择使用B+树之前,我相信很多小伙伴对数据结构中的树还是有些许模糊的,因此我们由浅入深一步步探讨树的演进过程,在一步步引出B树以及为什么MySQL数据库索引选择使 ...

  2. MySql数据库索引底层数据结构

    索引是帮助数据库高效获取数据的排好序的数据结构. 数据是如何存储与读取的? 1. 索引采用了什么数据结构呢? 常见的数据结构有:hash.二叉树.红黑树.B树.B+树. 首先来看如果采用Hash,它是 ...

  3. 数据库索引及其数据结构

    数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询.更新数据库表中数据.索引的实现通常使用B树及其变种B+树. 在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某 ...

  4. 数据库索引为什么使用B+树?

    概述 B tree: 二叉树(Binary tree),每个节点只能存储一个数. **B-tree:**B树(B-Tree,并不是B"减"树,横杠为连接符,容易被误导) B树属于多 ...

  5. 什么是mysql索引文件_数据库索引文件一般采用什么数据结构?

    展开全部 关于数据库索引的数据结构,636f707962616964757a686964616f31333433633438大多数数据库都是采用B树. 1.非主键索引需要在数据表本身的存储空间外额外开 ...

  6. 数据库索引,到底是什么做的?-- 转自沈剑公众号

    问题1. 数据库为什么要设计索引? 图书馆存了1000W本图书,要从中找到<架构师之路>,一本本查,要查到什么时候去? 于是,图书管理员设计了一套规则: (1)一楼放历史类,二楼放文学类, ...

  7. 【MySQL高级篇】第06章_索引的数据结构

    第06章_索引的数据结构 1. 为什么使用索引 索引是存储引擎用于快速找到数据记录的一种数据结构,就好比一本教科书的目录部分,通过目录中找到对应文章的页码,便可快速定位到需要的文章.MySQL中也是一 ...

  8. 数据库索引是什么?新华字典来帮你!

    点击蓝色"程序猿DD"关注我哟 来源:https://zhuanlan.zhihu.com/p/57359378 学过服务器端开发的朋友一定知道,程序没有数据库索引也可以运行.但是 ...

  9. 数据库索引相关面试题

    1.索引的底层实现原理和优化 B+树,经过优化的B+树,主要是在所有的叶子结点中增加了指向下一个叶子节点的指针,因此InnoDB建议为大部分表使用默认自增的主键作为主索引. 3.什么情况下设置了索引但 ...

最新文章

  1. continue语句只用于循环语句中_循环里continue,break,return的作用,你知道吗?
  2. 初学Java开发,有哪些从业方向可以选择?
  3. 是可改写的随机存储器_关于存储器的一些基础知识整理
  4. java字符串 删除指定字符的那些事
  5. zabbix配置飞信报警
  6. BZOJ2767:[JLOI2010]足彩投注
  7. ADO.NET编程(3)在内存中对DataTable进行增/删/改操作
  8. 导师说,再招女生,他就是孙子
  9. Nginx PHP Apache 隐藏版本号/禁止显示版本号
  10. 【java】中缀表达式转后缀表达式 java实现
  11. fences卸载_win10系统卸载fences的操作方法
  12. Smail语法(1)
  13. 马云留给阿里的财富:4个应用场景落地+90个区块链专利
  14. 工业以太网交换机特点分析及使用注意事项
  15. SPIR-V教程 -- SPIRV变量
  16. 计算机冗余,惯性导航计算机系统冗余设计
  17. linux su无效_linux su 认证失败解决方案转
  18. 【现代密码学】仿射密码加密
  19. Python项目实战之欢迎来到美多商城!学习目录导航
  20. 极路由修改为openwrt源并安装transmission挂pt

热门文章

  1. RabbitMq(八) SpringBoot整合RabbitMQ 生产者代码实现
  2. 20190719算法题存档
  3. java项目流程_Java项目开发全流程实践
  4. 最全面的MySQL面试题大全-一
  5. 怎样避免MYSQLD被OOM-KILLER杀死?
  6. CentOS下rpm命令使用
  7. IO多路复用中select、poll、epoll之间的区别
  8. 关于JVM垃圾回收的几个问题
  9. 关于JNI的几个问题
  10. MySQL中EXPLAIN详解