B+Tree

Mysql高手系列

邮差的信 提交于 2020-04-18 07:38:23
Mysql系列的目标是:通过这个系列从入门到全面掌握一个高级开发所需要的全部技能。 欢迎大家加我微信itsoku一起交流java、算法、数据库相关技术。 这是Mysql系列第22篇。 背景 使用mysql最多的就是查询,我们迫切的希望mysql能查询的更快一些,我们经常用到的查询有: 按照id查询唯一一条记录 按照某些个字段查询对应的记录 查找某个范围的所有记录(between and) 对查询出来的结果排序 mysql的索引的目的是使上面的各种查询能够更快。 预备知识 什么是索引? 上一篇中有详细的介绍,可以过去看一下: 什么是索引? 索引的本质: 通过不断地缩小想要获取数据的范围来筛选出最终想要的结果,同时把随机的事件变成顺序的事件,也就是说,有了这种索引机制,我们可以总是用同一种查找方式来锁定数据。 磁盘中数据的存取 以机械硬盘来说,先了解几个概念。 扇区 :磁盘存储的最小单位,扇区一般大小为512Byte。 磁盘块 :文件系统与磁盘交互的的最小单位(计算机系统读写磁盘的最小单位),一个磁盘块由连续几个(2^n)扇区组成,块一般大小一般为4KB。 磁盘读取数据 :磁盘读取数据靠的是机械运动,每次读取数据花费的时间可以分为 寻道时间、旋转延迟、传输时间 三个部分,寻道时间指的是磁臂移动到指定磁道所需要的时间,主流磁盘一般在5ms以下;旋转延迟就是我们经常听说的磁盘转速

MySQL之SQL优化详解(二)

半腔热情 提交于 2020-04-17 14:51:30
【推荐阅读】微服务还能火多久?>>> [TOC] MySQL之SQL优化详解(二) 1. SQL的执行顺序 1.1 手写顺序 1.2 机读顺序 2. 七种join 3. 索引 3.1 索引初探 是什么: 排好序的快速查找数据结构 两个主要的索引结构: B+tree 索引和哈希索引。 如何建: 1. ALTER TABLE table_name ADD INDEX index_name (column_list); 2. CREATE INDEX index_name ON table_name (column_list); **优点: **类似大学图书馆建书目索引,提高了检索效率,降低了数据库IO,同时还可以通过索引进行排序,降低数据排序的成本,降低了CPU的消耗 缺点: 虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行 insert 、 update 和 delete ,因为更新表时不仅要保存数据,还要保存一下索引文件每次更新添加了索引列的字段。 ###3.2 索引分类 1.**主键索引:**主键是一种唯一性索引,但它必须指定为 PRIMARY KEY ,每个表只能有一个主键 ALTER TABLE table_name ADD PRIMARY KEY (column_list) 2.**唯一索引:**索引列的所有值都只能出现一次,即必须 唯一,值可以为 空

MySQL 21道高频面试题及其解析

醉酒当歌 提交于 2020-04-05 15:02:30
Q1:MySQL主要有哪些存储引擎,分别适合哪些应用场景? 答:主要有①MyISAM,是5.5版本之前的默认存储引擎,支持表级锁,不支持事务和外键,并发效率较低,读取数据快,更新数据慢。适合以读操作为主,并且对并发性要求较低的应用。②InnoDB,MySQL目前的默认存储引擎,支持行级锁、事务和外键,并发效率好。适合对事务的完整性和并发性、数据的准确性要求比较高,增删操作多的应用。③Memory,所有的数据都保存在内存中,访问速度快,一旦服务关闭数据将丢失。适合更新不太频繁的数据量小的表用来快速得到访问结果。④Archive、Federated等。 Q2:索引是什么? 答:MySQL官方对索引的定义为:索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据, 这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。 Q3:索引的优缺点有哪些? 答:①优势:提高数据检索的效率,降低数据库的IO成本。通过索引列对数据进行排序,降低数据排序的成本,降低CPU的消耗。②劣势:实际上索引也是一张表,该表中保存了主键与索引字段,并指向实体类的记录,所以索引列也是要占用空间的。 虽然索引大大提高了查询效率,同时却也降低更新表的速度,如对表进行INSERT、UPDATE

面试宝典系列-Mysql索引的区别

青春壹個敷衍的年華 提交于 2020-03-25 12:58:03
3 月,跳不动了?>>> 叶节点包含了完整的数据记录。这种索引叫做聚集索引。因为InnoDB的数据文件本身要按主键聚集,所以InnoDB要求表必须有主键(MyISAM可以没有),如果没有显式指定,则MySQL 系统 会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列, 则 MySQL 自动为 InnoDB 表生成一个隐含字段作为主键,这个字段长度为 6 个字节 ,类型为长整形。 第一个重大区别是InnoDB的数据文件本身就是索引文件。从上文知道,MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。而在InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。 第二个与MyISAM索引的不同是InnoDB的辅助索引data域存储相应记录主键的值而不是地址。换句话说,InnoDB的所有辅助索引都引用主键作为data域。 聚集索引这种实现方式使得按主键的搜索十分高效,但是辅助索引搜索需要检索两遍索引:首先检索辅助索引获得主键,然后用主键到主索引中检索获得记录。 知道了InnoDB的索引实现后,就很容易明白为什么不建议使用过长的字段作为主键,因为所有辅助索引都引用主索引,过长的主索引会令辅助索引变得过大。再例如,

MySQL相关(四)- 性能优化不得不说的事情

老子叫甜甜 提交于 2020-03-10 09:48:52
前言 前面已经写了有两篇章长度的文章,第三篇我一直在寻思着要写什么(其实并没有),按照脑图来的话,这篇文章我们该来讲讲关于索引的知识了,这可是 MySQL 性能优化很关键的知识点,千万千万不要错过,不过我这里会相对比较深入地探究,相信大家读完之后多少会有点收获。 先送上两张飞机票🛬还没读过前面文章的伙伴可以先前往阅读,由浅入深: MySQL相关(一)- 一条查询语句是如何执行的 MySQL相关(二)- 一条更新语句是如何执行的 由于索引的知识点比较多,官网的内容也很多,如果大家想详细了解可以到官网,想先通读了解的话可以先看看我对索引的总结,这一章节分为三部分来讲: innodb 逻辑存储结构需要了解,作为番外篇 MySQL相关(番外篇)- innodb 逻辑存储结构 ; 索引的数据结构也作为另外的篇章,通过对查询算法的数据模型进行演算分析 MySQL相关(三)- 索引数据模型推演及 B+Tree 的详细介绍 ; 对索引的使用及优化规则也会作为单独的篇章 MySQL相关(四)- 性能优化关键点索引 前面提到的脑图如下,想要完整高清图片可以到微信我的公众号下【6曦轩】下回复 MySQL 脑图获取: 正文 索引到底是什么? 索引的定义 我们先来看看维基百科对索引的定义: 数据库索引,是数据库管理系统(DBMS)中一个排序的数据结构,以协助快速查询、 更新数据库表中数据。

MySQL Btree 索引背后的数据结构及算法原理

蹲街弑〆低调 提交于 2020-03-09 10:02:00
索引的本质 MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。提取句子主干,就可以得到索引的本质:索引是数据结构。 我们知道,数据库查询是数据库的最主要功能之一。我们都希望查询数据的速度能尽可能的快,因此数据库系统的设计者会从查询算法的角度进行优化。最基本的查询算法当然是 顺序查找 (linear search),这种复杂度为O(n)的算法在数据量很大时显然是糟糕的,好在计算机科学的发展提供了很多更优秀的查找算法,例如 二分查找 (binary search)、 二叉树查找 (binary tree search)等。如果稍微分析一下会发现,每种查找算法都只能应用于特定的数据结构之上,例如二分查找要求被检索数据有序,而二叉树查找只能应用于 二叉查找树 上,但是数据本身的组织结构不可能完全满足各种数据结构(例如,理论上不可能同时将两列都按顺序进行组织),所以,在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引。 看一个例子: 图1 图1展示了一种可能的索引方式。左边是数据表,一共有两列七条记录,最左边的是数据记录的物理地址(注意逻辑上相邻的记录在磁盘上也并不是一定物理相邻的)。为了加快Col2的查找,可以维护一个右边所示的二叉查找树

MySQL索引背后的数据结构及算法原理

半腔热情 提交于 2020-03-09 10:01:11
摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题。特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈希索引,全文索引等等。为了避免混乱,本文将只关注于BTree索引,因为这是平常使用MySQL时主要打交道的索引,至于哈希索引和全文索引本文暂不讨论。 文章主要内容分为三个部分。 第一部分主要从数据结构及算法理论层面讨论MySQL数据库索引的数理基础。 第二部分结合MySQL数据库中MyISAM和InnoDB数据存储引擎中索引的架构实现讨论聚集索引、非聚集索引及覆盖索引等话题。 第三部分根据上面的理论基础,讨论MySQL中高性能使用索引的策略。 数据结构及算法基础 索引的本质 MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。提取句子主干,就可以得到索引的本质:索引是数据结构。 我们知道,数据库查询是数据库的最主要功能之一。我们都希望查询数据的速度能尽可能的快,因此数据库系统的设计者会从查询算法的角度进行优化。最基本的查询算法当然是 顺序查找 (linear search),这种复杂度为O(n)的算法在数据量很大时显然是糟糕的,好在计算机科学的发展提供了很多更优秀的查找算法,例如 二分查找 (binary search)、 二叉树查找

财务平台亿级数据量毫秒级查询优化之elasticsearch原理解析

て烟熏妆下的殇ゞ 提交于 2020-03-01 08:28:30
说在前面 财务平台进行分录分表以后,随着数据量的日渐递增,业务人员对账务数据的实时分析响应时间越来越长,体验性慢慢下降,之前我们基于mysql的性能优化做了一遍,可以说基于mysql该做的优化已经基本上都做了,本次是基于elasticsearch对其做进一步的性能优化 正文 mysql索引原理 基于mysql最常用也最直接有效的性能优化也就是添加索引。 mysql索引是怎么实现的呢?数据库最基本的查询算法是顺序查找,时间复杂度为O(n),显然在数据量很大的时候很低,优化的查询算法有二分查找,二叉树查找,虽然查找效率提高了,但是各自对检索的数据都有要求,二分查找检索被要求数据是有序的,而二叉树查找只能用于二叉树上,但是数据本身的组织结构不可能完全满足各种数据结构,例如,理论上不可能同时将两列都按顺序进行组织,所以在数据之外,数据库系统还维护者满足特定查找算法的数据结构,这些数据结构以某种方式引用数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。 索引是什么?索引是存储引擎用于快速找到记录的一种数据结构,这是索引的基本功能,主要基于hash,b+tree。 我们开发当中一般用到都是mysql innoDB引擎,采用的是b+tree。 b+tree的优势主要体现在查询性能上,在单元素查询时,b+tree会自顶层向下逐层查找节点,最终找到我们需要的叶子节点,范围查询时

为什么选取B+树做索引?

浪子不回头ぞ 提交于 2020-02-28 04:50:42
索引的物理存储 与B-Tree相比,B+Tree有以下不同点: 非叶子结点的子树指针与关键字个数相同; 非叶子结点的子树指针P[i],指向关键字值属于[K[i], K[i+1])的子树(B-树是开区间); 为所有叶子结点增加一个链指针; 所有关键字都在叶子结点出现; 内节点不存储data,只存储key 如:(M=3) 为什么B+Tree更适合做文件索引 因为B+ Tree的内部节点并没有指向关键字具体信息的指针,所以他的内部节点比其他结构的更小,同样大小的盘块能够容纳更多的单位索引结构,一次性读入内存的关键字信息索引就更多,相对来说IO读写次数也就少很多 。 为什么不用AVL数或者红黑树做索引 这个问题回答之前,我们往往评价程序、数据结构、算法的优良好坏由时间和空间决定 空间: 红黑树是二叉树的进化和演变而来的,是一种平衡二叉查找树:(红黑树) 抛开红黑树的其他性质,红黑树每一个父节点都有一个或者两个子节点,那么我们知道,计算机存储结构的最小单元是页,那么就是我无论是否会占满整个页系统都会给分配一个最小存储单元:页(InnoDB一页大小固定默认是16k),那么这就很容易造成了空间上的大量浪费:因为很可能两个子节点根本就无法占满一页!这就造成了空间上的浪费! 时间: 二叉树,红黑树的最大的特点就是同样大小的盘块不能够容纳更多的单位索引结构(数据在内节点存放)

从原理到优化,深入浅出数据库索引

白昼怎懂夜的黑 提交于 2020-02-27 12:24:17
MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。 数据库查询是数据库的最主要功能之一,我们都希望查询数据的速度能尽可能的快,因此数据库系统的设计者会从查询算法的角度进行优化,这篇文章对索引做一个系统的梳理,希望对大家有帮助。 一、MySQL有哪些索引类型 索引的分类可以从多个角度进行,下面分别从数据结构,物理存储和业务逻辑三个维度进行划分。 1、从数据结构角度 (1)B+树索引(O(log(n))) 关于B+树索引,后面会深入解析 (2)hash索引 仅仅能满足"=","IN"和"<=>"查询,不能使用范围查询 其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B-Tree 索引 只有Memory存储引擎显示支持hash索引 (3)FULLTEXT索引 现在MyISAM和InnoDB引擎都支持了 (4)R-Tree索引 用于对GIS数据类型创建SPATIAL索引 2、从物理存储角度 (1)聚集索引(clustered index) 正文内容按照一个特定维度排序存储,这个特定的维度就是聚集索引; Innodb存储引擎中行记录就是按照聚集索引维度顺序存储的,Innodb的表也称为索引表;因为行记录只能按照一个维度进行排序