mysql学习(2)索引的本质

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

问题:SQL查询慢怎么办?

优化手段,加索引。

索引是帮助MYSQL高效的获取数据的排好序数据结构。

问题:索引结构为什么使用Btree而不使用二叉树,红黑树或者HASH结构?

c1c900521dc65abc769edf1a90221702c83.jpg

9bdde83b121476a9bb09735e4cfdf7063b6.jpg二叉树的特性,右边子节点的值大于父节点,且左边子节点的值小于父节点

二叉树:使用二叉树来做索引的数据结构,当索引值递增的时候,二叉树也会不断地增加右子节点 ,那么在查找索引的时候,所做的IO操作,等同于没有索引逐行查找数据的IO操作。

041e22786014a84768a7309e4825a92d9cd.jpg

红黑树:平衡二叉树。随着数据量增大,树的高度也会变高。2的N次方=数量量(假设100万),那么N至少也是50,那么树的高度也是50,如果数据在子叶节点上,那么至少要经过50次的IO操作,才能找到数据。

HASH:散列表结构,key不适合排序,而且数据是散列的分布的,不利于IO读写。

BTree:一个节点上,横向扩展。即一个节点上,可以存储多个元素(Degree),且每个元素,都可以有子节点,叫做多叉树。

  • 度(Degree)-节点的数据存储个数
  • 叶节点具有相同深度
  • 叶节点的指针为空
  • 节点中的数据KEY从左至右递增排列

    以5阶B树举例

88eb6adcbb4bf5d015405fe5089fd980bce.jpg

B+Tree(Btree变种)

  • 非叶子节点不存储data,只存储key,可以增大度(Degree)-节点的数据存储个数
  • 叶子节点不存储指针
  • 叶子节点增加了顺序访问指针,提高区间访问的性能

以5阶B+树举例

df500de3d868d992daa47ab83a791cba975.jpg

问题:Btree和B+Tree的区别?

  • Btree每个节点,都包含了key和data,而B+tree只有叶子节点保存了key和data,其他节点,只保存了key,方便增大度的个数
  • B+tree的叶子节点之间, 增加了指针,提高了查询区间的性能,不需要像Btree一样每次都从根节点开始查找
  • Btree中,父节点和叶子节点,关键字的字段值不会冗余,而B+tree会冗余的存储关键的索引值,即父节点和叶子结点都存在相同的关键值

MyISAM索引实现(非聚集)

MyISAM索引文件和数据文件是分离的。它是针对建表的,而不是针对数据库的,既同一个数据库可以多种类型的表,myISAM和innoDB。

在mysql的文件件中,会发现一个表有三个文件:

  • test_table_myisam.frm // 存储表的结构,表的定义
  • test_table_myisam.MYD // 存储表的数据
  • test_table_myisam.MYI // 存储表的索引文件

myisam存储引擎是非聚集索引,所以在MYI的文件中,以B+tree的数据结构存储了表的索引信息,而索引内容中的data,是指向数据的在MYD文件中的地址。

在myisam存储引擎中,主键索引使用了B+tree,而辅助索引,非主键索引,也同样根据字段的值,使用了B+tree结构来存储。

innoDB索引实现(聚集)

  • 表数据文件本身就是按B+Tree组织的一个索引结构文件

    b656b75058059556a6e200e976f45f97d18.jpg

  • 聚集索引 定义:叶节点包含了完整的数据记录
  • 为什么innoDB表必须有主键,并且推荐使用整形的自增主键?
  • 为什么非主键索引结构叶子节点存储的是主键值?(一致性和节省存储空间)

在mysql的文件件中,会发现一个表有两个文件:

  • test_table_myisam.frm  // 存储表的结构,表的定义
  • test_table_myisam.ibd  // 存储表的索引+数据

在innoDB存储引擎中,辅助索引、非主键索引都不是聚集索引。

5be26d62c77b716bc36f10e466aa0d68e26.jpg

问题:为什么B+tree比Btree快?

树的高度h,影响了查找效率,因为从根节点开始,每次查找下一个节点,都可能需要一次IO读写。所以增加非叶子节点的度,可以有效提高查询效率。而CPU从磁盘上读取数据到内存中,最小单元是页,一页读取的最小数据是4KB,而CPU一次IO,读取的数据是一页的整数倍,且最大值也有限制。而mysql在底层,设置的大小是16KB。所以B+TREE要把数据放在叶子节点,所以非叶子几点,就可以增加更多的节点数。而Btree节点和数据是保存在一起的,所以非叶节点的节点数,要比B+tree少,树的高度就比B+tree高。

问题:为什么MYSQL页文件默认的配置是16KB?

我们假设一行的数据是1K,那我们一页的数据,就能存储16行数据,也就是一个叶节点可以存储16条记录;再来看非叶节点,假设ID是bigint类型,那么长度为8B,指针大小在InnoDB源码中为64(6B),一共就是14B,那么一页里面就可以存储16K/14=1170个(主键+指针)

那么一颗高度为2的B+树能存储的数据为:1170*16=18720条,一颗高度为3的B+树可以存储1170*1170*16=21902400(千万条)

原因就是16KB就足够应对千万条表记录了。

问题:为什么innoDB表必须有主键,并且推荐使用整形的自增主键?

         使用innoBD存储引擎时,要建立主键索引,如果我们没有主动创建索引,那么innoDB会自动帮我们建立主键索引。innoDB会在我们创建的表里找一列唯一的,可以代表主键的字段来创建主键索引,如果没有这样的字段,innoDB会默认加一列字段,来创建主键索引。有点类似oracle中的rowId。为什么要推荐整形而且自增的字段当做主键?为什么建议使用整形类型,因为如果使用uuid作为主键索引,uuid类型比整数类型大,为了方便IO操作一次读取4个页的数据(mysql默认16KB,一页是4KB),意味索引的非叶子节点上的关键字要比使用整数类型的关键字数量小,那么B+tree的高度就可能增加,那么读取叶子节点上的数据的IO操作次数就增加了。那么查找的效率就低了。为什么要自增,因为当新纪录插入时,主键自增的话,在B+tree中插入节点比较方便,而使用uuid为主键,新纪录的uuid不一定比前面的uuid大,可能会将新纪录插在靠前面的叶子节点中,叶子节点满了,会取中间的关键字向上存放到父节点中,可能会造成树的分裂,微观上性能就比自增的差。

转载于:https://my.oschina.net/xiaoyoung/blog/3041322

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/251869.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CSS3:CSS3 文本效果

ylbtech-CSS3:CSS3 文本效果1.返回顶部 1、CSS3 文本效果 CSS3 文本效果 CSS3中包含几个新的文本特征。 在本章中您将了解以下文本属性: text-shadowbox-shadowtext-overflowword-wrapword-break浏览器支持 属性 text-shadow4.010.03.54.09.5box-sha…

洛谷 P2296 寻找道路

题目描述 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1 .路径上的所有点的出边所指向的点都直接或间接与终点连通。 2 .在满足…

Feature Preprocessing on Kaggle

刚入手data science, 想着自己玩一玩kaggle,玩了新手Titanic和House Price的 项目, 觉得基本的baseline还是可以写出来,但是具体到一些细节,以至于到能拿到的出手的成绩还是需要理论分析的。 本文旨在介绍kaggle比赛到各种原理与技巧&#xf…

如果您遇到文件或数据库问题,如何重置Joomla

2019独角兽企业重金招聘Python工程师标准>>> 如果您遇到Joomla站点的问题,那么重新安装其核心文件和数据库可能是最佳解决方案。 了解问题 这种方法无法解决您的所有问题。但它主要适用于由Joomla核心引起的问题。 运行Joomla核心更新后,这些…

Genymotion模拟器拖入文件报An error occured while deploying the file的错误

今天需要用到资源文件,需要将资源文件拖拽到sd卡中,但老是出现这个问题: 资源文件拖不进去genymotion。查看了sd的DownLoad目录,确实没有成功拖拽进去。 遇到这种问题的,我按下面的思路排查问题: Genymotio…

激光炸弹(BZOJ1218)

激光炸弹&#xff08;BZOJ1218&#xff09; 一种新型的激光炸弹&#xff0c;可以摧毁一个边长为R的正方形内的所有的目标。现在地图上有n(N<10000)个目标&#xff0c;用整数Xi,Yi(其值在[0,5000])表示目标在地图上的位置&#xff0c;每个目标都有一个价值。激光炸弹的投放是…

用servlet设计OA管理系统时遇到问题

如果不加单引号会使得除变量和int类型的值不能传递 转发和重定向的区别 转发需要填写完整路径&#xff0c;重定向只需要写相对路径。原因是重定向是一次请求之内已经定位到了服务器端&#xff0c;转发则需要两次请求每次都需要完整的路径。 Request和response在解决中文乱码时的…

[Usaco2010 Mar]gather 奶牛大集会

1827: [Usaco2010 Mar]gather 奶牛大集会 Time Limit: 1 Sec Memory Limit: 64 MB Submit: 1129 Solved: 525 [Submit][Status][Discuss]Description Bessie正在计划一年一度的奶牛大集会&#xff0c;来自全国各地的奶牛将来参加这一次集会。当然&#xff0c;她会选择最方便的…

1-1、作用域深入和面向对象

课时1&#xff1a;预解释 JS中的数据类型 number、string、 boolean、null、undefined JS中引用数据类型 object: {}、[]、/^$/、Date Function var num12; var obj{name:白鸟齐鸣,age:10}; function fn(){ console.log(勿忘初心方得始终&#xff01;) }console.log(fn);//把整…

JWT协议学习笔记

2019独角兽企业重金招聘Python工程师标准>>> 官方 https://jwt.io 英文原版 https://www.ietf.org/rfc/rfc7519.txt 或 https://tools.ietf.org/html/rfc7519 中文翻译 https://www.jianshu.com/p/10f5161dd9df 1. 概述 JSON Web Token&#xff08;JWT&#xff09;是…

验证Oracle收集统计信息参数granularity数据分析的力度

最近在学习Oracle的统计信息这一块&#xff0c;收集统计信息的方法如下&#xff1a; DBMS_STATS.GATHER_TABLE_STATS (ownname VARCHAR2, ---所有者名字tabname VARCHAR2, ---表名partname VARCHAR2 DEFAULT NULL, ---要分析的分区名estimate_percent NUMBER DEFAULT NULL, …

Python之NumPy(axis=0 与axis=1)区分

Python之NumPy&#xff08;axis0 与axis1&#xff09;区分 转载于:https://www.cnblogs.com/greatljg/p/10802392.html

20165320 第九周学习总结

主要内容&#xff1a; 1.URL类 URL类是java.net包中的一个重要的类&#xff0c;使用URL创建对象的应用程序称为客户端程序。URL 的构造方法&#xff1a;try { URL url new URL ("http://www.google.com"); } catch (MalformedURLException e) {System.out.println(&…

Python 函数的执行流程-函数递归-匿名函数-生成器

1 函数的执行流程函数的执行需要对函数进行压栈的&#xff0c;什么是压栈呢&#xff0c;简而言之就是在函数执行时在栈中创建栈帧存放需要变量以及指针的意思。具体涉及的知识非常多&#xff0c;这里就已一个Python脚本简单进行分析。当我们运行上面代码时&#xff0c;它的执行…

【2】信息的表示和处理

1.现代计算机存储和处理的信息都以二值信号表示。 2.机器为什么要使用二进制进行存储和处理&#xff1f; 答&#xff1a;二值信号能够很容易的被表示、存储、传输。例如&#xff1a; 可以表示为穿孔卡片上有洞和无洞、导线上的高压和低压&#xff0c;顺逆时针的磁场。 3.大多数…

java版b2b2c社交电商spring cloud分布式微服务(二) 服务消费者(rest+ribbon)

一、ribbon简介 Ribbon is a client side load balancer which gives you a lot of control over the behaviour of HTTP and TCP clients. Feign already uses Ribbon, so if you are using FeignClient then this section also applies. —–摘自官网 ribbon是一个负载均衡客…

[学习笔记]支配树

被支配树支配的恐惧 定义 显然&#xff0c;这个支配关系是一个树&#xff08;或者如果有的点不能从r到达&#xff0c;就是一个树一堆点&#xff09;。 首先不会成环&#xff0c;其次也不会是DAG 即如果A支配C&#xff0c;B支配C&#xff0c;那么A和B之间必然有支配关系 解法 首…

RBAC 权限设计(转载)

来源 &#xff1a;https://blog.csdn.net/rocher88/article/details/43190743 这是我在网上找的一些设计比较好的RBAC权限管理不知道&#xff0c;像新浪、搜狐、网易、百度、阿里巴巴、淘宝网的RBAC用户权限这一块&#xff0c;都是这种细颗粒的RBAC设计开发&#xff0c;还是把他…

20172311 2017-2018-2 《程序设计与数据结构》第八周学习总结

20172311 2017-2018-2 《程序设计与数据结构》第八周学习总结 教材学习内容总结 本周对JAVA中的多态性进行了学习 多态性引用能够随时间变化指向不同类型的对象&#xff0c;是通过后绑定实现的。实现多态性的主要途径有两种&#xff1a; 1.由继承实现多态性 2.利用接口实现多态…

Linux系统安装Apache 2.4.6

http://www.cnblogs.com/kerrycode/p/3261101.html Apache简介 Apache HTTP Server&#xff08;简称Apache&#xff09;是Apache软件基金会的一个开放源码的网页服务器&#xff0c;可以在大多数计算机操作系统中运行&#xff0c;由于其多平台和安全性被广泛使用&#xff0c;是最…