BTree

每日一面

删除回忆录丶 提交于 2021-01-09 08:55:41
本问题参考: https://www.zhihu.com/question/410506694/answer/1368215298 ,答案为个人原创 MySQL innoDB引擎索引基于 B+树,B+树有以下特点: 图片参考自: 链接 每个节点中子节点的个数不能超过 N,也不能小于 N/2(不然会造成页分裂或页合并) 根节点的子节点个数可以不超过 m/2,这是一个例外 m 叉树只存储索引,并不真正存储数据,只有最后一行的叶子节点存储行数据。 通过链表将叶子节点串联在一起,这样可以方便按区间查找 同时,InnoDB主键索引和非主键索引不一样。主键索引,叶子节点是行所有数据,非主键索引叶子节点只是这一列的数据以及指向主键的指针,如果需要其他列数据则需要通过主键指针查询聚簇索引。 然后,就需要提到一个概念, innodb_page_size 。InnoDB引擎读取数据, 是一页一页读取的 ,这是InnoDB读取一页数据的大小。 innodb_page_size 是一个初始化数据库实例的参数,在目前的版本中(>=5.7.6),可以选择的值有 4096, 8192, 16384, 32768, 65536 。 默认是16KB 一般越小,内存划分粒度越大,使用率越高,但是会有其他问题,就是限制了索引字段还有整行的大小。innodb引擎读取内存还有更新都是一页一页更新的,这个 innodb

Mysql系列-性能优化神器EXPLAIN使用介绍及分析

北慕城南 提交于 2021-01-05 04:00:20
 MySQL 提供了一个 EXPLAIN 命令, 它可以对 SELECT 语句进行分析, 并输出 SELECT 执行的详细信息, 以供开发人员针对性优化。  EXPLAIN 命令用法十分简单, 在 SELECT 语句前加上 Explain 就可以了, 例如: EXPLAIN SELECT * from user_info WHERE id < 300 ; 下面是我结合我自己创建的表以及执行相关sql语句总结的相关知识点。 准备 为了接下来方便演示 EXPLAIN 的使用, 首先我们需要建立两个测试用的表, 并添加相应的数据: DROP TABLE IF EXISTS `customers`; CREATE TABLE `customers` ( `customerNumber` int ( 11 ) NOT NULL , `customerName` varchar ( 50 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL , `contactLastName` varchar ( 50 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL , `contactFirstName` varchar ( 50 ) CHARACTER SET utf8 COLLATE

Mysql临时表突增问题定位与分析

蹲街弑〆低调 提交于 2021-01-02 16:39:38
一、问题现象 数据展示系统出现异常,首页刷不出数据,查看日志后发现模块无法连接数据库(从库,以下数据库都表示从库),紧接着数据分析模块出现报警,服务器出现磁盘空间不足报警。 查看AWS RDS监控发现,在时间段 ‘08.31 19:15:00 - 09.01 01:19:00’ 内,数据库实例存储空间急剧下降 监控显示,数据库连接数量没有明显增加,但在该时间段内磁盘IO明显增大 磁盘IO 数据库连接数量 通过查看实例上磁盘的占用情况,发现磁盘临时表占用了大量空间(420G/500G),于是我们开始定位为何会有大量的临时表被持久化到磁盘上 二、问题分析与复现 2.1 临时表 MySQL中有两种临时表:外部临时表和内部临时表。其中外部临时表可有用户查询时手动创建保存一些中间数据,提升查询效率等; 内部临时表会在查询过程中由Mysql自动创建并存储某些中间操作的结果,这种操作可能出现在优化阶段或者执行阶段,所以这种临时表对用户不可见,一般通过EXPLAIN可以查看查询语句是否用到了内部临时表。 而内部临时表又可以被分为磁盘临时表和内存临时表,Mysql在使用内部临时表时会优先使用内存临时表,即将临时表存放在内存里,当临时表过大或内存不够用时,就会转化成磁盘临时表,存放在ibtmp1文件中。 在Mysql5.7中,内存临时表在查询结束后会被释放,而文件ibtmp1占用的空间不会被自动释放

红黑树(第一篇)

守給你的承諾、 提交于 2020-12-28 01:14:50
介绍 R-B Tree全称Red-Black Tree,又名红黑树 1972年由鲁道夫.贝尔发明 一种自平衡二叉查找树 二叉查找树每个节点增加一个存储位表示节点的颜色,非黑即红 时间复杂度O(log n) 二叉查找树? 平衡二叉查找树? 二叉查找树 Binary Search Tree 若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值 若任意节点的右子树不空,则右子树上所有节点的值均大于它的根节点的值 任意节点的左、右子树也分别为二叉查找树 没有键值相等的节点 时间复杂度O(log n)(最好的情况下) 例子 二叉查找树 退化成线性的二叉查找树,时间复杂度O(n) 平衡二叉查找树 AVL 任何一个节点的左子树与右子树都是平衡二叉查找树,且高度之差的绝对值不超过1(即平衡因子:左子树高度-右子树高度,1 or 0 or -1) 严格的平衡二叉查找树 对于查找友好,对于插入、删除不够友好,频繁破坏规则,频繁旋转以适应规则 例子 RB特性 每个节点或者黑色,或者红色 根节点是黑色 每个叶子节点(NIL)是黑色(注:此处叶子节点,指为空(NIL或NULL)的叶子节点) 如果一个节点是红色的,则它的子节点必需是黑色的 对任意节点,其到叶子节点(NIL)的每条路径都包含相同数目的黑色节点 例子 时间复杂度 定理:一棵含有n个节点的红黑树的高度至多为2log(n+1) 逆否命题

阿里面试真题:请你说说索引的原理

大憨熊 提交于 2020-12-23 16:29:40
https://blog.csdn.net/mu_wind/article/details/110128016 前言 相信每个IT界大佬,简历上少不了Mysql索引这个关键字,但如果被问起来,你能说出多少干货呢?先看下面几个问题测试一下吧: 索引是怎么提高查询效率的?可以为了提高查询效率增加索引么? mysql索引系统采用的数据结构是什么? 为什么要使用B+树? 聚集索引相对于非聚集索引的区别? 什么是回表? 什么是索引覆盖? 什么是最左匹配原则? 索引失效场景有哪些,如何避免? 这些问题说不明白?不要慌!请带着问题向下看。 1 索引原理探究 什么是数据库索引?先来个官方一些的定义吧。 在关系数据库中,索引是一种单独的、物理的数对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。 这段话有点绕,其实把索引理解为图书目录,就非常好理解了。 如果我们想在图书中查找特定内容,在没有目录的情况下只能逐页翻找。与此类似,当执行下面这样一条SQL语句时,假如没有索引,数据库如何查找到相对应的记录呢? SELECT * FROM student WHERE name = '叶良辰' 搜索引擎只能扫描整个表的每一行,并依次对比判断 name 的值是否等于“叶良辰”。我们知道,单纯的内存运算是很快的

MySQL 优化:覆盖索引、延迟关联

╄→гoц情女王★ 提交于 2020-12-23 07:32:36
作者: 一枝花算不算浪漫 [1] 原文地址:https://www.cnblogs.com/wang-meng/p/ae6d1c4a7b553e9a5c8f46b67fb3e3aa.html 小结: 回表 :回到主键索引树搜索的过程,我们称为回表。 覆盖索引 :就是 select 的数据列只用从索引中就能够取得,不必从数据表中读取。简单点说就是你要查的数据索引里都有,一次搞定,美滋滋 😎。 延迟关联 :通过使用覆盖索引查询返回需要的主键,再根据主键关联原表获得需要的数据。 1. 前言 上周新系统改版上线,上线第二天就出现了较多的线上 慢 sql 查询,紧接着 dba 给出了定位及解决方案,这里较多的是使用 延迟关联 去优化。 而我对于这个 延迟关联 也是第一次听说(o(╥﹏╥)o),所以今天一定要学习并产出一篇学习笔记。( ^▽^ ) 2. 回表 我们都知道 InnoDB 采用的 B+ tree 来实现索引的,索引又分为主键索引(聚簇索引)和普通索引(二级索引)。 那么我们就来看下 基于主键索引和普通索引的查询有什么区别? 如果语句是 select * from T where ID=500,即主键查询方式,则只需要搜索 ID 这棵 B+树; 如果语句是 select * from T where k=5,即普通索引查询方式,则需要先搜索 k 索引树,得到 ID 的值为 500

MySQL中的存储过程、函数与触发器

心不动则不痛 提交于 2020-12-22 07:13:47
一.对待存储过程和函数的态度 优点: 1.存储过程只在创建时进行编译,sql语句则每次执行都需要编译。能提高数据库执行速度。 2.简单复杂操作结合事物一起封装。 3.复用性高。 4.安全性高,可指定存储过程的使用权。 在 实际项目中应该尽量少用存储过程和函数 ,理由如下: 1. 移植性差 ,在MySQL中的存储过程移植到sqlsever上就不一定可以用了。 2. 调试麻烦 ,在db中报一个错误和在应用层报一个错误不是一个概念,那将是毁灭性打击,直接一个error:1045什么的更本毫无头绪。 3. 扩展性不高 。 所以在互联网时代大型项目应该尽量少使用(不使用)存储过程和函数。 二.创建存储过程 2.1什么是存储过程? 存储过程和存储函数都是一组sql语句的集合。这些语句集合被当做一个整体存入数据库中。 2.2创建存储过程的语法: create procedure 存储过程名(参数列表) sql语句 例子: delimiter // create procedure pro() reads sql data begin select * from stu; end 那么我们现在就有一个存储过程pro了,但是这个存储过程他是没有参数的,他只是执行一次查询操作。 我们现在来讲解一下这个存储过程的结构: delimiter // 是将分号转化为// 因为在sql执行时当他遇到分号 ;

mysql优化:覆盖索引(延迟关联)

孤者浪人 提交于 2020-12-22 06:50:16
前言 上周新系统改版上线,上线第二天就出现了较多的线上 慢sql 查询,紧接着dba 给出了定位及解决方案,这里较多的是使用 延迟关联 去优化。 而我对于这个 延迟关联 也是第一次听说(o(╥﹏╥)o),所以今天一定要学习并产出一篇学习笔记。( ^▽^ ) 回表 我们都知道InnoDB采用的B+ tree来实现索引的,索引又分为主键索引(聚簇索引)和普通索引(二级索引)。 那么我们就来看下 基于主键索引和普通索引的查询有什么区别? 如果语句是select * from T where ID=500,即主键查询方式,则只需要搜索ID这棵B+树; 如果语句是select * from T where k=5,即普通索引查询方式,则需要先搜索k索引树,得到ID的值为500,再到ID索引树搜索一次。这个过程称为回表。 举个栗子: 可以看出我们有一个普通索引k,那么两颗B+树的示意图如下: (注:图来自极客时间专栏) 当我们查询 select * from T where k=5 其实会先到k那个索引树上查询k = 5,然后找到对应的id为500,最后回表到主键索引的索引树找返回所需数据。 如果我们查询 select id from T where k=5 则不需要回表就直接返回。 也就是说,基于非主键索引的查询需要多扫描一棵索引树。因此,我们在应用中应该尽量使用主键查询。 覆盖索引 解释一

必看!PHP常见面试题——MySQL篇(一)

怎甘沉沦 提交于 2020-12-18 12:55:35
1. 说说自己对于 MySQL 常见的两种存储引擎:MyISAM与InnoDB的理解? InnoDB 引擎: InnoDB 引擎提供了对数据库 acid 事务的支持,并且还提供了行级锁和外键的约束,它的设计的目标就是处理大数据容量的数据库系统。MySQL 运行的时候,InnoDB 会在内存中建立缓冲池,用于缓冲数据和索引。但是该引擎是不支持全文搜索,同时启动也比较的慢,它是不会保存表的行数的,所以当进行 select count() from table 指令的时候,需要进行扫描全表。由于锁的粒度小,写操作是不会锁定全表的,所以在并发度较高的场景下使用会提升效率的。 MyIASM 引擎: MySQL 的默认引擎,但不提供事务的支持,也不支持行级锁和外键。因此当执行插入和更新语句时,即执行写操作的时候需要锁定这个表,所以会导致效率会降低。不过和 InnoDB 不同的是,MyIASM 引擎是保存了表的行数,于是当进行 select count() from table 语句时,可以直接的读取已经保存的值而不需要进行扫描全表。所以,如果表的读操作远远多于写操作时,并且不需要事务的支持的,可以将 MyIASM 作为数据库引擎的首选。 2. 谈谈你对MySQL索引的理解? MySQL索引使用的数据结构主要有BTree索引 和 哈希索引 。对于哈希索引来说,底层的数据结构就是哈希表

【建议收藏】MySQL 三万字精华总结 —索引(二)

核能气质少年 提交于 2020-12-18 03:17:45
四、索引 ❝ 说说你对 MySQL 索引的理解? 数据库索引的原理,为什么要用 B+树,为什么不用二叉树? 聚集索引与非聚集索引的区别? InnoDB引擎中的索引策略,了解过吗? 创建索引的方式有哪些? 聚簇索引/非聚簇索引,mysql索引底层实现,为什么不用B-tree,为什么不用hash,叶子结点存放的是数据还是指向数据的内存地址,使用索引需要注意的几个地方? MYSQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构,所以说 索引的本质是:数据结构 索引的目的在于提高查询效率,可以类比字典、 火车站的车次表、图书的目录等 。 可以简单的理解为“排好序的快速查找数据结构”,数据本身之外, 数据库还维护者一个满足特定查找算法的数据结构 ,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引。下图是一种可能的索引方式示例。 左边的数据表,一共有两列七条记录,最左边的是数据记录的物理地址。 为了加快Col2的查找,可以维护一个右边所示的二叉查找树,每个节点分别包含索引键值,和一个指向对应数据记录物理地址的指针,这样就可以运用二叉查找在一定的复杂度内获取到对应的数据,从而快速检索出符合条件的记录。 索引本身也很大,不可能全部存储在内存中, 一般以索引文件的形式存储在磁盘上 平常说的索引,没有特别指明的话