叶子结点

MySQL 索引原理以及慢查询优化

大憨熊 提交于 2019-12-03 23:55:47
本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题。特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈希索引,全文索引等等。为了避免混乱,本文将只关注于BTree索引,因为这是平常使用MySQL时主要打交道的索引,至于哈希索引和全文索引本文暂不讨论。 文章主要内容分为四个部分: 第一部分主要从数据结构以及计算机主存、磁盘存取的层面讨论MySQL数据库索引。 第二部分主要讨论MySQL中不同引擎(主要讲解MyISAM和InnoDB)的B-Tree索引对比,包括聚集索引、非聚集索引等话题。 第三部分根据上面的理论基础,讨论MySQL中高性能使用索引的策略。 第四部分根据实际案例分析慢查询以及如何进行优化。 第五部分是标注的参考的文章。 1、索引的数据结构以及算法基础 1.1、索引的本质 MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。提取句子主干,就可以得到索引的本质:索引是一种数据结构。 数据库查询是数据库的主要功能之一,最基本的查询算法是顺序查找(linear search)时间复杂度为O(n),显然在数据量很大时效率很低。优化的查找算法如二分查找(binary search)、二叉树查找(binary tree search)等

数据结构中各种树

a 夏天 提交于 2019-12-03 23:09:33
阅读目录 1. 二叉树 2. 二叉查找树 3. 平衡二叉树 3.1 平衡查找树之AVL树 3.2 平衡二叉树之红黑树 4. B树 5. B+树 6. B*树 7. Trie树   数据结构中有很多树的结构,其中包括二叉树、二叉搜索树、2-3树、红黑树等等。本文中对数据结构中常见的几种树的概念和用途进行了汇总,不求严格精准,但求简单易懂。 回到顶部 1. 二叉树   二叉树是数据结构中一种重要的数据结构,也是树表家族最为基础的结构。 二叉树的定义: 二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。二叉树的第i层至多有2 i-1 个结点;深度为k的二叉树至多有2 k-1 个结点;对任何一棵二叉树T,如果其终端结点数为n 0 ,度为2的结点数为n 2 ,则n 0 =n 2 +1。 二叉树的示例 : 满二叉树和完全二叉树:   满二叉树:除最后一层无任何子节点外,每一层上的所有结点都有两个子结点。也可以这样理解,除叶子结点外的所有结点均有两个子结点。节点数达到最大值,所有叶子结点必须在同一层上。   满二叉树的性质:   1) 一颗树深度为h,最大层数为k,深度与最大层数相同,k=h;   2) 叶子数为2 h ;   3) 第k层的结点数是:2 k-1 ;   4) 总结点数是:2 k-1 ,且总节点数一定是奇数。   完全二叉树

红黑树

点点圈 提交于 2019-12-03 20:18:51
二叉查找树特点 1.左子树上所有结点的值均小于或等于它的根结点的值。 2.右子树上所有结点的值均大于或等于它的根结点的值。 3.左、右子树也分别为二叉排序树。 红黑树特点 1、节点是红色或者黑色 2、根节点是黑色 3、每个叶子的节点都是黑色的空节点(NULL) 4、每个红色节点的两个子节点都是黑色的 5、从任意节点到每个叶子节点的所有路径都包含相同的黑色节点 二叉查找树调整为红黑树的方法 变色、旋转 来源: https://www.cnblogs.com/nachdenken/p/11806628.html

探寻数据库索引的底层原理

穿精又带淫゛_ 提交于 2019-12-03 20:16:26
我们都有到图书馆借书的经历,偌大的图书馆,为什么能在短的时间内找到想要找的书?如果这些书是杂乱无章的堆放,或者没有任何标识的放在书架,那么还能这么快的找到吗?这个场景就很接近我们软件开发中使用数据库的场景,图书馆的书就类似我们数据表中的数据,楼层索引牌、书架分类标识、索书号就类似我们查找数据的索引。那我们常用的数据库的索引底层的一个数据结构是什么样的呢?要了解数据库索引的底层原理,我们就得先了解一种叫树的数据结构,而树中很经典的一种数据结构就是二叉树!所以下面我们就从二叉树到平衡二叉树,再到B-树,最后到B+树来一步一步了解数据库索引底层的原理! 一.二叉树(Binary Search Trees) 二叉树是每个结点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用于实现二叉查找树和二叉堆。二叉树有如下特性: 1、每个结点都包含一个元素以及n个子树,这里0≤n≤2。 2、左子树和右子树是有顺序的,次序不能任意颠倒。左子树的值要小于父结点,右子树的值要大于父结点。   光看概念有点枯燥,假设我们现在有这样一组数[35 27 48 12 29 38 55],顺序的插入到一个数的结构中,步骤如下 好了,这就是一棵二叉树啦!我们能看到,经通过一系列的插入操作之后,原本无序的一组数已经变成一个有序的结构了

决策树系列三——基尼指数,减枝和

心不动则不痛 提交于 2019-12-03 15:40:02
- - coding: utf-8 - - """ Created on Tue Aug 14 17:36:57 2018 @author: weixw """ import numpy as np 定义树结构,采用的二叉树,左子树:条件为true,右子树:条件为false leftBranch:左子树结点 rightBranch:右子树结点 col:信息增益最大时对应的列索引 value:最优列索引下,划分数据类型的值 results:分类结果 summary:信息增益最大时样本信息 data:信息增益最大时数据集 class Tree: def init (self, leftBranch=None, rightBranch=None, col=-1, value=None, results=None, summary=None, data=None): self.leftBranch = leftBranch self.rightBranch = rightBranch self.col = col self.value = value self.results = results self.summary = summary self.data = data def __str__(self): print(u"列号:%d" % self.col) print(u"列划分值

20182301 2019-2020-1 《数据结构与面向对象程序设计》第8周学习总结

百般思念 提交于 2019-12-03 11:42:27
20182301 2019-2020-1 《数据结构与面向对象程序设计》第8周学习总结 教材学习内容总结 第十三章 查找 线性查找:依次将每个值进行查找 Comparable 接口允许多态实现算法,而不是只应用于特定的类 while (result == null&&index<data.length){ if (data[index].compareTo(target)==0) result=data[index]; index++; } 二分查找 Comparable result = null; int first = 0 ,last = data.length-1 while( result ==null && first <=last){ mid =(first + last)/2; if(data[mid].compareTo(target)==0) result=data[mid]; else if(data[mid].compareTo(target)>0) last = mid-1; else first = mid+1; } 排序 选择排序 void SelectSort(int a[],int n) //选择排序 { int mix,temp; for(int i=0;i<n-1;i++) //每次循环数组,找出最小的元素,放在前面,前面的即为排序好的 {

证书透明化日志工作原理

走远了吗. 提交于 2019-12-03 05:33:54
目录 概念 一致性证明和审计证明 默克一致性证明 默克审计证明 使用证明 译: How Log Proofs Work 概念 证书透明日志使用特殊的加密算法有助于证书和日志的公共审查。这个特殊的加密算法称作 默克哈希树(Merkle hash tree) ,一种包含哈希叶和结点的简单二叉树(图1)。叶子是已附加到日志中的单个证书的哈希。节点是成对的子叶或成对的子节点的哈希。所有叶子和结点的根,即根哈希称作 默克树哈希(Merkle tree hash) 。当日志服务器对默克树哈希(及其他信息)签名,称为 签名树头(STH:signed tree head ) 。 定期地,可能一小时一次,日志服务器将新获取到的证书追加到日志中。通过新获取到的证书创建单独的默克树哈希,该哈希和之前已在哈希树中的旧默克树哈希结合成新的默克树哈希(图2)。对新的默克树哈希签名创建新签名树头。反反复复的持续,之前提交到日志中的所有证书形成了一个不断增长的默克树。 一致性证明和审计证明 因为这种构造方式,默克哈希树让日志高效迅速的证明两件事: 所有证书被一致性地附加到日志中 特定的证书附加到日志中 日志通过提供两个加密证明来支持:默克一致性证明和默克审计证明。 默克一致性证明 默克一致性证明验证一条日志的任意两个版本是一致的:即,新版本包含旧版本的一切,换句话说,所有新条目紧跟在上个版本的条目后

【经典数据结构】B树与B+树

大城市里の小女人 提交于 2019-12-03 04:42:20
维基百科对B树的定义为“在计算机科学中,B树(B-tree)是一种树状数据结构,它能够存储数据、对其进行排序并允许以O(log n)的时间复杂度运行进行查找、顺序读取、插入和删除的数据结构。B树,概括来说是一个节点可以拥有多于2个子节点的二叉查找树。与自平衡二叉查找树不同,B-树为系统最优化 大块数据的读和写操作 。B-tree算法减少定位记录时所经历的中间过程,从而加快存取速度。普遍运用在 数据库 和 文件系统 。” 定义 B 树 可以看作是对2-3查找树的一种扩展,即他允许每个节点有M-1个子节点。 根节点至少有两个子节点 每个节点有M-1个key,并且以升序排列 位于M-1和M key的子节点的值位于M-1 和M key对应的Value之间 其它节点至少有M/2个子节点 下图是一个M=4 阶的B树: 可以看到B树是2-3树的一种扩展,他允许一个节点有多于2个的元素。 B树的插入及平衡化操作和2-3树很相似,这里就不介绍了。下面是往B树中依次插入 6 10 4 14 5 11 15 3 2 12 1 7 8 8 6 3 6 21 5 15 15 6 32 23 45 65 7 8 6 5 4 的演示动画: B+ 树是对B树的一种变形树,它与B树的差异在于: 有k个子结点的结点必然有k个关键码; 非叶结点仅具有索引作用,跟记录有关的信息均存放在叶结点中。

笔记:数据结构与算法

隐身守侯 提交于 2019-12-03 02:31:02
数据结构与算法 常用排序算法 实现比较丑陋,勿喷啊 冒泡排序 :从前向后比较相邻的元素。如果前一个比后一个大,就交换他们两个,每一轮把一个最大的数运到数组最后面。 public static int[] sort(int[] arr) { int len = arr.length; // 冒泡总次数 for (int i = 1; i < len; i++) { boolean flag = true; // 每次冒泡过程 for (int j = 0; j < len - i; j++) { if (arr[j] > arr[j + 1]) { MyUtils.swap(arr, j, j + 1); flag = false; } } if (flag) { // 如果一个冒泡过程没改变,退出返回已经有序 break; } } return arr; } 选择排序 :每次从未排序数组中找一个最小的元素,放到以有序数组后面 public static int[] sort(int[] arr) { int len = arr.length; // 选择次数 for (int i = 0; i < len - 1; i++) { int min = i; // 每次选择过程 for (int j = i + 1; j < len; j++) { if (arr[j] < arr

平衡二叉树

匿名 (未验证) 提交于 2019-12-03 00:40:02
why? what? when? how? 最近几天看了某个大佬写的学习总结,觉得这个方式不错就引进了。 why 为什么要用平衡二叉树? 二叉搜索树 二叉搜索树的查找效率和 BST 建立的时候节点输入顺序相关。 1. 若输入节点顺序 1、2、3、4、5 树的深度为 5,查找效率 O(N),平均查找长度 ASL = ( 1+2+3+4+5 ) / 5 = 3 2. 若输入节点顺序 4、3、5、1、2 该树是完全二叉树,树的深度是 3,查找效率是 O(log2n), ASL = ( 1+2 2+3 2 ) / 5 = 2.1 因为 BST 的查询效率和节点输入的顺序有很大联系最坏情况是 O(N),为了提高查询效率所以平衡二叉树(查找的时间复杂度 O(log2N) ―― 证明见定义后面)出现了。 what 什么是平衡二叉树? 平衡因子( Balance Factor,简称 BF ):BF(T)=hL-hR,其中hL和hR分别为T的左、右子树的高度。 平衡二叉树 ( Balanced Binary Tree ) ( AVL树 ) 空树,或者任一结点左、右子树高度差的绝对值不超过1,即 |BF(T)| <= 1 . 平衡二叉树的高度能达到 log2N 吗? 如果能到达那么相比 BST 查询效率会高很多。 证明:设nh高度为h的平衡二叉树的最少结点数。结点数最少时: 若结点一个 1