数据库索引的数据结构b+树
- 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,最后得到检索的数据。索引的最左匹配属性。
- IO次数取决于b+树额高度h,假设当前数据表的数据为N,每个磁盘块的数据项的数量是m。则有h=log(m+1)N,当数据量N一定的情况下,m越大,h越小;而m=磁盘块的大小/数
- 建索引的几大原则:
- 最左前匹配原则
- =和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+树相关推荐
- 为什么MySQL数据库索引选择使用B+树?
在进一步分析为什么MySQL数据库索引选择使用B+树之前,我相信很多小伙伴对数据结构中的树还是有些许模糊的,因此我们由浅入深一步步探讨树的演进过程,在一步步引出B树以及为什么MySQL数据库索引选择使 ...
- MySql数据库索引底层数据结构
索引是帮助数据库高效获取数据的排好序的数据结构. 数据是如何存储与读取的? 1. 索引采用了什么数据结构呢? 常见的数据结构有:hash.二叉树.红黑树.B树.B+树. 首先来看如果采用Hash,它是 ...
- 数据库索引及其数据结构
数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询.更新数据库表中数据.索引的实现通常使用B树及其变种B+树. 在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某 ...
- 数据库索引为什么使用B+树?
概述 B tree: 二叉树(Binary tree),每个节点只能存储一个数. **B-tree:**B树(B-Tree,并不是B"减"树,横杠为连接符,容易被误导) B树属于多 ...
- 什么是mysql索引文件_数据库索引文件一般采用什么数据结构?
展开全部 关于数据库索引的数据结构,636f707962616964757a686964616f31333433633438大多数数据库都是采用B树. 1.非主键索引需要在数据表本身的存储空间外额外开 ...
- 数据库索引,到底是什么做的?-- 转自沈剑公众号
问题1. 数据库为什么要设计索引? 图书馆存了1000W本图书,要从中找到<架构师之路>,一本本查,要查到什么时候去? 于是,图书管理员设计了一套规则: (1)一楼放历史类,二楼放文学类, ...
- 【MySQL高级篇】第06章_索引的数据结构
第06章_索引的数据结构 1. 为什么使用索引 索引是存储引擎用于快速找到数据记录的一种数据结构,就好比一本教科书的目录部分,通过目录中找到对应文章的页码,便可快速定位到需要的文章.MySQL中也是一 ...
- 数据库索引是什么?新华字典来帮你!
点击蓝色"程序猿DD"关注我哟 来源:https://zhuanlan.zhihu.com/p/57359378 学过服务器端开发的朋友一定知道,程序没有数据库索引也可以运行.但是 ...
- 数据库索引相关面试题
1.索引的底层实现原理和优化 B+树,经过优化的B+树,主要是在所有的叶子结点中增加了指向下一个叶子节点的指针,因此InnoDB建议为大部分表使用默认自增的主键作为主索引. 3.什么情况下设置了索引但 ...
最新文章
- continue语句只用于循环语句中_循环里continue,break,return的作用,你知道吗?
- 初学Java开发,有哪些从业方向可以选择?
- 是可改写的随机存储器_关于存储器的一些基础知识整理
- java字符串 删除指定字符的那些事
- zabbix配置飞信报警
- BZOJ2767:[JLOI2010]足彩投注
- ADO.NET编程(3)在内存中对DataTable进行增/删/改操作
- 导师说,再招女生,他就是孙子
- Nginx PHP Apache 隐藏版本号/禁止显示版本号
- 【java】中缀表达式转后缀表达式 java实现
- fences卸载_win10系统卸载fences的操作方法
- Smail语法(1)
- 马云留给阿里的财富:4个应用场景落地+90个区块链专利
- 工业以太网交换机特点分析及使用注意事项
- SPIR-V教程 -- SPIRV变量
- 计算机冗余,惯性导航计算机系统冗余设计
- linux su无效_linux su 认证失败解决方案转
- 【现代密码学】仿射密码加密
- Python项目实战之欢迎来到美多商城!学习目录导航
- 极路由修改为openwrt源并安装transmission挂pt