B+Tree

MySQL的存储引擎InnoDB选择了B+ 树

我的梦境 提交于 2020-08-13 03:00:05
我们知道数据的存储和检索是两个很重要的功能,当我们的数据量大了,怎么能快速的检索数据呢,答案是使用索引,可索引具体的技术实现有很多,选择哪一种呢,我就以mysql为例记录下它为什么选择了B+树作为索引的实现方式。 1. 索引简介    索引是一种用于快速查询行的数据结构 ,就像一本书的目录就是一个索引,如果想在一本书中找到某个主题,一般会先找到对应页码。MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。提取句子主干,就可以得到索引的本质: 索引是数据结构 。 2. 索引的几种数据结构类型 2.1 哈希索引(hash index) 哈希索引(hash index)基于哈希表(也可以叫散列表)实现 ,只有精确匹配索引所有列的查询才有效。对于每一行数据,存储引擎都会对所有的索引列计算一个哈希码(hash code),哈希码是一个较小的值,并且不同键值的行计算出来的哈希码也不一样。哈希索引将所有的哈希码存储在索引中,同时在哈希表中保存指向每个数据行的指针。 ​ 下面举个小例子 ​ 它能快速的检索数据,不过在mysql数据库却有局限: a): 哈希索引数据并不是按照索引值顺序存储的,所以无法用来进行排序; b): 不能进行多列字段查询数据; c): 更不支持范围查询,比如查询年龄大于30,。 d): 有大量重复键值的情况下,哈希索引的效率也是极低的

老大让我整理下公司内部mysql使用规范,分享给大家

放肆的年华 提交于 2020-08-12 08:32:38
最近涉及数据库相关操作较多,公司现有规范也不是太全面,就根据网上各路大神的相关规范,整理了一些自用的规范用法,万望指正。 数据库环境 dev: 开发环境 开发可读写,可修改表结构。开发人员可以修改表结构,可以随意修改其中的数据但是需要保证不影响其他开发同事。 test: 测试环境 开发可读写,开发人员可以通过工具修改表结构。 online: 线上环境 开发人员不允许直接在线上环境进行数据库操作,如果需要操作必须找DBA进行操作并进行相应记录,禁止进行压力测试。 重点的问题,各个环境的mysql服务器对应的用户权限,一定要做到权限划分明确,有辨识度,能具体区分业务场景等。 命名规范 基本命名规则 使用有意义的英文词汇,词汇中间以下划线分隔。(不要用拼音) 只能使用英文字母,数字,下划线,并以英文字母开头。 库、表、字段全部采用小写,不要使用驼峰式命名。 避免用ORACLE、MySQL的保留字,如desc,关键字如index。 命名禁止超过32个字符,须见名之意,建议使用名词不是动词 数据库,数据表一律使用前缀 临时库、表名必须以tmp为前缀,并以日期为后缀 备份库、表必须以bak为前缀,并以日期为后缀 为什么库、表、字段全部采用小写? 在 MySQL 中,数据库和表对就于那些目录下的目录和文件。因而,操作系统的敏感性决定数据库和表命名的大小写敏感。 Windows下是不区分大小写的。

自己动手写SQL执行引擎

徘徊边缘 提交于 2020-08-11 10:27:05
自己动手写SQL执行引擎 前言 在阅读了大量关于数据库的资料后,笔者情不自禁产生了一个造数据库轮子的想法。来验证一下自己对于数据库底层原理的掌握是否牢靠。在笔者的github中给这个database起名为Freedom。 整体结构 既然造轮子,那当然得从前端的网络协议交互到后端的文件存储全部给撸一遍。下面是Freedom实现的整体结构,里面包含了实现的大致模块: 最终存储结构当然是使用经典的B+树结构。当然在B+树和文件系统block块之间的转换则通过Buffer(Page) Manager来进行。当然了,为了完成事务,还必须要用WAL协议,其通过Log Manager来操作。 Freedom采用的是索引组织表,通过DruidSQL Parse来将sql翻译为对应的索引操作符进而进行对应的语义操作。 MySQL Protocol结构 client/server之间的交互采用的是MySQL协议,这样很容易就可以和mysql client以及jdbc进行交互了。 query packet mysql通过3byte的定长包头去进行分包,进而解决tcp流的读取问题。再通过一个sequenceId来再应用层判断packet是否连续。 result set packet mysql协议部分最复杂的内容是其对于result set的读取,在NIO的方式下加重了复杂性。

MySQL基础知识

人走茶凉 提交于 2020-08-10 20:05:15
1、union和union all的区别: union和union all都可以将两边的查询结果合并,区别在于union的合并会去掉重复行,并且使用默认的排序规则。而union all返回所有行(包括重复行),且对结果不进行排序。 举例如现在创建2张表: Create table Table1 ( id int not null, name varchar(20) not null ); Create table Table2 ( id int not null, name varchar(20) not null ); 插入数据(数据来自网上): Insert into Table1 values (1,'姚羽'); Insert into Table1 values (2,'边兵兵'); Insert into Table1 values (3,'袁磊'); Insert into Table2 values (1,'姚羽'); Insert into Table2 values (2,'柳春平'); Insert into Table2 values (3,'张永超'); Insert into Table2 values (4,'刘华健'); 执行:select * from Table1 union select * from Table2; 执行:select *

MySQL的存储引擎InnoDB选择了B+ 树

萝らか妹 提交于 2020-08-10 18:11:40
我们知道数据的存储和检索是两个很重要的功能,当我们的数据量大了,怎么能快速的检索数据呢,答案是使用索引,可索引具体的技术实现有很多,选择哪一种呢,我就以mysql为例记录下它为什么选择了B+树作为索引的实现方式。 1. 索引简介    索引是一种用于快速查询行的数据结构 ,就像一本书的目录就是一个索引,如果想在一本书中找到某个主题,一般会先找到对应页码。 MySQL 官方对索引的定义为:索引( Index )是帮助 MySQL 高效获取数据的数据结构。提取句子主干,就可以得到索引的本质: 索引是数据结构 。 2. 索引的几种数据结构类型 2.1 哈希索引(hash index) 哈希索引(hash index)基于哈希表(也可以叫散列表)实现 ,只有精确匹配索引所有列的查询才有效。对于每一行数据,存储引擎都会对所有的索引列计算一个哈希码(hash code),哈希码是一个较小的值,并且不同键值的行计算出来的哈希码也不一样。哈希索引将所有的哈希码存储在索引中,同时在哈希表中保存指向每个数据行的指针。 下面举个小例子 它能快速的检索数据,不过在mysql数据库却有局限: a): 哈希索引数据并不是按照索引值顺序存储的,所以无法用来进行排序; b): 不能进行多列字段查询数据; c): 更不支持范围查询,比如查询年龄大于30,。 d): 有大量重复键值的情况下,哈希索引的效率也是极低的

索引的类型

99封情书 提交于 2020-08-10 07:26:02
主键索引、唯一键索引、普通索引、全文索引、组合索引。 主键设置为自增,数据库会使用自增锁来维护主键的有序性;索引设置为自增,可以方便管理索引,否则会涉及到页分裂与列合并,影响性能 覆盖索引:一张表有两个列Id,Name,select id from table where Name = '';只需要查找Name的B+Tree不需要在去查找Id的,这种情况加做覆盖索引; 回表操作指的是InnoDb,InnoDb非主键索引存储的不是行数据,所以有回表;MyISam索引表中存储的是数据的地址,所以不存在回表; 组合索引:设计到最左匹配原则,建立索引的时候,需要注意索引列的顺序;维护一个name,age组合索引,当where条件为age=10,组合索引会失效,因为最左原则,name都没有,就没有必要查下去了,如果where name=‘aaa’,该组合索引是有效的,相当于先查name,再查age; 索引下推:简历组合索引,name,age,入下图数据,相当于对mysql索引查询的优化,索引下推之前,根据name条件查询出符合的数据,然后根据ID,在去Id索引表查询数据并比较age值;索引下推,根据name条件查询出符合的数据,在匹配age条件,符合条件的Id返回去; 持久性 通过redo log实现 数据插入数据库:数据插入会保存在用户态的某块内存中,数据积累到一定数量回进行系统调用

面试官常考的MySQL索引(MySQL进阶)

邮差的信 提交于 2020-08-09 20:30:22
你好我是辰兮,很高兴你能来阅读,本篇是整理了索引基础学习的相关知识点,带你认识了解索引的数据结构,实现原理,分享获取新知,希望对你有帮助,一起加油,共同进步。 1.JAVA基础面试常考问题 : JAVA面试基础常考题汇集 2.JAVA面试SSM框架常考 : JAVA框架面试题汇集 文章目录 一、索引定义 二、索引分类 三、索引原理 四、索引数据结构 一、索引定义 MySQL官方定义:索引(Index)是帮助MySQL高效获取数据的数据结构。 作用: 可以提高查询效率。 关键词:数据结构 用来提高查询效率 二、索引分类 索引是在存储引擎中实现的,也就是说不同的存储引擎,会使用不同的索引。MyISAM和InnoDB存储引擎:只支持BTREE索引,也就是说默认使用BTREE,不能够更换。MEMORY/HEAP存储引擎:支持HASH和BTREE索引。 mysql的索引我们分为三大类来讲单列索引(普通索引,唯一索引,主键索引)、组合索引、全文索引。 索引名称 作用 主键索引 主键是一种唯一性索引,但它 必须指定为PRIMARY KEY ,每个表只能有一个主键 唯一索引 索引列的所有值都 只能出现一次 ,即必须唯一,值可以为空 普通索引 基本的索引类型, 值可以为空 ,没有唯一性的限制 全文索引 全文索引的索引类型为FULLTEXT 全文索引可以在varchar、char

MySQL数据库应用全解

不羁的心 提交于 2020-08-09 20:24:07
MySQL的存储引擎 常用引擎的区别 mysql有三种存储引擎分别为 三种存储引擎的区别 如何选择存储引擎 数据库的五种分类 DDL(Data Definition Language)数据定义语言 DML(Data Manipulation Language)数据操作语言 **DQL(Data Query Language) 数据查询语言** sql执行先后问题 内连接 外连接 子查询 查询实际应用 DCL(Data Control Language)数据控制语言 TCL(Transaction Control Language) 事务控制语言 事务特性 事务的隔离性 MySQL数据库的隔离级别 数据库慢查询日志 数据库的索引 索引的创建原则 索引的失效情况 索引的数据结构 有哪些数据结构及特点 MySQL中的B+Tree MySQL函数 字符串函数 日期函数 数据函数 高级函数 case表达式【相当于java中swtich语句】 if表达式 cast(显示)类型转换【了解】 数据库的优化 常用引擎的区别 mysql有三种存储引擎分别为 InnoDB 、MyiSAM、Memory 三种存储引擎的区别 InnoDB MyiSAM Memory mysql5.5之后默认的存储引擎 mysql5.5之前默认的存储引擎 内存存储引擎(很少用到) 支持事务 不支持事务 支持外键

【MySQL系列1】MySQL索引为何选择B+树

萝らか妹 提交于 2020-08-08 13:51:24
MySQL为何选择B+树存储索引 声明 什么是索引 二分查找法(Binary Search) 二叉查找树(BST) 二叉树的特点 二叉树存在的问题 平衡二叉树(AVL Tree) 平衡二叉树的特点 MySQL为何不选择平衡二叉树 索引需要存储什么 AVL树用来存储索引存在什么问题 多路平衡树(Balanced Tree) B树的特点 B树是如何查找数据的 B+树 B+树的特点 B+树是如何查找数据的 B+树相对于B树的改进点 总结 声明 本文所述的各种数据结构(二叉树等),均不考虑重复值的情况,本文简述各种数据结构的区别仅仅只是为了理解MySQL索引的需要而做的铺垫。 什么是索引 提起索引,大家都知道,建立索引可以让数据库查询更快,那么索引究竟是什么?我想这就不是每个人都能说得出来了。 索引,是数据库管理系统中一个排序的数据结构,并用以协助快速查询、 更新数据库表中数据 。 是的,索引是一种数据结构,但是那么多的数据结构中为何MySQL要选择B+树呢?接下来就让我们一起来了解下B+树相对于其他数据结构有何独特之处! 二分查找法(Binary Search) 首先让我们自己想一想,如果让我们去设计,我们会怎么去存储?我想大部分人想到就是用链表或者数组去存储数据,然后再按默认的顺序排好,再去查找,而一个排好顺序的链表我们就可以通过二分查找法来高效查询。 二分查找也称折半查找

mysql的索引底层原理详解

断了今生、忘了曾经 提交于 2020-08-08 12:14:27
参考文章: mysql的索引底层原理 什么是索引 概念:索引是提高mysql查询效率的数据结构。总的一句话概括就是索引是一种数据结构。 数据库查询是数据库的最主要功能之一。设计者们都希望查询数据的速度能尽可能的快,因此数据库系统的设计者会从查询算法的角度进行优化。最基本的查询算法当然是顺序查找(linear search),这种复杂度为O(n)的算法在数据量很大时显然是糟糕的,好在计算机科学的发展提供了很多更优秀的查找算法,例如:有顺序查找、折半查找、快速查找等。 但是每种查找算法都只能应用于特定的数据结构之上,例如顺序查找依赖于顺序结构,折半查找通过二叉查找树或红黑树实现二分搜索。因此在数据之外,数据库系统还维护着满足特定查找算法的数据结构。这种数据结构,就是索引。 Mysql索引原理 目前大多数数据库系统及文件系统都采用 B-Tree 或其变种 B+Tree 作为索引结构。B+ 树索引是 B+ 树在数据库中的一种实现,是最常见也是数据库中使用最为频繁的一种索引。 从最早的平衡二叉树演化而来的。B+ 树是由二叉查找树、平衡二叉树(AVLTree)和平衡多路查找树(B-Tree)逐步优化而来。 那么为什么mysql的索引选择B+数呢? 红黑树也可以作为数据结构也可以用来实现索引,但是文件系统以及数据库系统普遍采用B树或者B+树,这里结合计算的组成原理来深入的分析。 一般来说