B+Tree

程序员必须了解的知识点—你搞懂mysql索引机制了吗?

≯℡__Kan透↙ 提交于 2020-11-12 10:25:50
一、索引是什么 MySQL官方对索引的定义为:索引(Index)是帮助MySQL 高效 获取数据的数据结构,而MYSQL使用的数据结构是: B+树 在这里推荐大家看一本书, 《深入理解计算机系统的书》 1.1 局部性原理 程序和数据的访问都有聚集成群的倾向,在一个时间段内,仅使用其中一小部分,在最近的将来将用到的信息很可能与现在正在使用的信息在空间地址上是临近的( 称空间局部性 ),或者最近访问过的程序代码和数据,很快又被访问的可能性很大( 称时间局部性 )。 1.2 磁盘预读 预读的长度一般为页(page)的整数倍 页是存储器的逻辑块,操作系统往往将主存和磁盘存储区分割成连续的大小相等的块,每个存储块称为一页(在许多操作系统中,页大小通常为4K),主存和磁盘以页为单位交换数据 1.3 简介 在使用数据库中,通常数据库查询是数据库的最主要功能之一。但每种查找算法都只能应用于特定的数据结构之上。 例如二分查找要求被检索数据有序 而二叉树查找只能应用于二叉查找树上,但是数据本身的组织结构不可能完全满足各种数据结构(例如,理论上不可能同时将两列都按顺序进行组织),所以,在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是 索引 。 索引一般以文件形式存储在磁盘上,索引检索需要磁盘I

玩转Mysql系列

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

B树索引最通俗易懂的介绍

余生长醉 提交于 2020-10-28 02:22:13
先来一段有莫的对话: 前几天下班回到家后正在处理一个白天没解决的bug,厕所突然传来对象的声音:   对象:xx,你有《时间简史》吗?   我:我去!妹子,你这啥癖好啊,我有时间也不会去捡屎啊!   对象:...人家说的是霍金的科普著作《时间简史》,是一本书啦!   我:哦,那我没有...   对象:人家想看诶,你明天帮我去图书馆借一本吧...   我:我明天还要改...   对象:你是不是不爱我了,分手!   我:我一大早就去~   第二天一大早我就到了图书馆,刚进门就看到一个索引牌,标识着不同楼层的功能,这样我很快能定位到我要找的目标所在的楼层了。      我到楼上后又看到每排的书架上又对书的分类进行了细分,这样我能更快的定位到我要找的书具体在哪个书架!   并且每个楼层都有一台查询终端,输入书名就能查到对应的唯一标识“索书号”,类似于P159-49/164这样的一个编码,书架上的书都是按照这个编码进行排序的!有了这个编码再去对应的书架上,很快就能找到对应的书在书架的具体位置了。      不到十分钟,我就从图书馆借好书出来了。   这么大的图书馆,我为什么能在这么短的时间内找到我要的书?如果这些书是杂乱无章的堆放,或者没有任何标识的放在书架,我还能这么快的找到吗?   这不禁让我想到了我们开发中用到的数据库,图书馆的书就类似我们数据表中的数据,楼层索引牌、书架分类标识

MyISAM 和 InnoDB 索引结构及其实现原理

て烟熏妆下的殇ゞ 提交于 2020-10-14 05:57:23
数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。 索引的实现通常使用B_TREE。 B_TREE索引加速了数据访问,因为存储引擎不会再去扫描整张表得到需要的数据; 相反,它从根节点开始,根节点保存了子节点的指针,存储引擎会根据指针快速寻找数据。 MyISAM引擎 使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址. 即:MyISAM索引文件和数据文件是分离的,MyISAM的索引文件仅仅保存数据记录的地址。 MyISAM中索引检索的算法为首先按照B+Tree搜索算法搜索索引, 如果指定的Key存在,则取出其data域的值,然后以data域的值为地址,读取相应数据记录。 MyISAM的索引方式也叫做“非聚集”的。 物理文件结构为: .frm文件:与表相关的元数据信息都存放在frm文件,包括表结构的定义信息等。 .myd(mysql data)文件:myisam存储引擎专用,用于存储myisam表的数据 .myi(mysql index)文件:myisam存储引擎专用,用于存储myisam表的索引相关信息 InnoDB引擎 也使用B+Tree作为索引结构,但是InnoDB的数据文件本身就是索引文件,叶节点data域保存了完整的数据记录。 这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。这种索引叫做

MYSQL8在Ubuntu 18.04.3安装,索引,性能分析基本介绍

不问归期 提交于 2020-10-07 00:57:56
MYSQL MYSQL架构介绍 MYSQL简介 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司。 MySQL是一种关联数据库管理系统,将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这就增加速度并提高了灵活性。 MYSQL安装 安装 在 Ubuntu 18.04.3下安装mysql8 wget https://dev.mysql.com/get/mysql-apt-config_0.8.15-1_all.deb sudo dpkg -i mysql-apt-config_0.8.15-1_all.deb sudo apt install mysql-server mysql -u root -p select host, user, authentication_string, plugin from mysql.user; MYSQL用户与权限管理 MYSQL用户管理 1.创建用户 创建hb用户,密码123 create user 'hbx'@'%' identified with mysql_native_password by '123'; 创建hb用户,ip:192.118.1.1,密码123 create user 'hb'@'192.118.1.1' identified by '123'; 创建ip:192

我在广州面试的那些事

两盒软妹~` 提交于 2020-10-02 10:02:05
背景   这次的疫情让原本看似有序的但是浮躁的社会彻底打乱了,不少劳动者在多年稳定的节奏也随之而变,而我在于其中放慢了步调,从5月份放弃了一份工作同时拒绝了两份offer后回家休息加造人。休息期间接了些技术顾问的工作,看了几本书增加自己的知识量,写了几篇博客做了些之前工作的总结,也打了王者荣耀尝试冲荣耀王者。   那么从2019年12月开始至今,我在广州面试了不少公司,基本都是应聘系统架构师和部门负责人的岗位,中间有不少的故事,有体验极好的也有体验极差的,我都将在下文分享给大家,体验极差的我就不直接点名了。 PS:此文非引战,如有评论,请理性沟通 壹物壹码   先说一个体验及其好的,这也是我遇到为数不多非常尊重人的,黄埔区区的安居宝科技园里的 壹物壹码公司,从面试官的交谈得知公司做的范围比较的广,主要以前期接项目后期看潜力转产品的这样的一个模式,业务比较稳定,以上市为目标,主要在BOSS直聘发布招聘消息。   我当时是投了高级软件工程师的,但是薪资范围挺高的所以我当时心里觉得没那么简单,HR联系我的时候说CEO想直接面我,我人在老家因此邀请了做一个视频面试,面试官也爽快的答应了。一面是产品总监面,说实话很给面子,完全不问我技术,他说看了我的博客、开源项目和简历,理念跟他的很像很会从软件工程的角度给团队提高生产力,所以不担心我的技术。另外,他们这次想招的是技术总监或者系统架构师

狂刷四遍398道java最新MySQL笔记后,我三面阿里研发部,成功定级P7

爷,独闯天下 提交于 2020-09-30 04:30:59
最近疫情趋于平稳,也是金九银十好时节,出来面试的人也多了起来。我发现不少候选人,对数据库的认知还处在比较基础的阶段,以为会写 “增删改查”、做表关联 就足够了,那些工作中经常出现的问题,却支支吾吾答不上来,比如: ◆ count(*) 慢该如何解决? ◆ 对于千万级的大表,MySQL 要怎么优化? ◆ SQL 使用 Join 好,还是多次 Select 好? ◆ 1000 多万条数据,建了索引还是慢,该怎么办? 想来,我在用 MySQL 的过程中,遇到的问题也是五花八门, 从开发技巧到管理维护,从性能问题到安全问题。 第一个感受就是,MySQL 本身是个设计优良的系统,其中有很多巧妙的设计思路,比如 WAL 机制、索引的实现、缓存的处理方式等等 ,掌握好这些,能解决日常工作中的很多问题。 那会儿,也没少在网上找资料,虽说有所收获,但内容大多脱离真实的软件开发,看的时候各种明白,上手实操就原形毕露了。 太简短不全面,禁不住深挖,因此很多次都掉坑里,那么如何避坑呢? 刚好,通过最近的学习整理出一份《MySQL性能调优与架构笔记及面试题》,笔记里都有详细讲到,已打包好,文末有免费获取方式。 MySQL性能调优与架构笔记 一、基础篇 MySQL基本介绍 MySQL架构组成 MySQL存储引|擎简介 MySQL安全管理 MySQL备份与恢复 二、性能优化篇

我在广州面试的那些事

假如想象 提交于 2020-08-17 05:40:20
背景   这次的疫情让原本看似有序的但是浮躁的社会彻底打乱了,不少劳动者在多年稳定的节奏也随之而变,而我在于其中放慢了步调,从5月份放弃了一份工作同时拒绝了两份offer后回家休息加造人。休息期间接了些技术顾问的工作,看了几本书增加自己的知识量,写了几篇博客做了些之前工作的总结,也打了王者荣耀尝试冲荣耀王者。   那么从2019年12月开始至今,我在广州面试了不少公司,基本都是应聘系统架构师和部门负责人的岗位,中间有不少的故事,有体验极好的也有体验极差的,我都将在下文分享给大家,体验极差的我就不直接点名了。 PS:此文非引战,如有评论,请理性沟通 壹物壹码   先说一个体验及其好的,这也是我遇到为数不多非常尊重人的,黄浦区的安居宝科技园里的 壹物壹码公司,从面试官的交谈得知做的范围比较的广,主要以前期接项目后期看潜力转产品的这样的一个模式,业务比较稳定,以上市为目标,主要在BOSS直聘发布招聘消息。   我当时是投了高级软件工程师的,但是薪资范围挺高的所以我当时心里觉得没那么简单,HR联系我的时候说CEO想直接面我,我人在老家因此邀请了做一个视频面试,面试官也爽快的答应了。一面是产品总监面,说实话很给面子,完全不问我技术,他说看了我的博客、开源项目和简历,理念跟他的很像很会从软件工程的角度给团队提高生产力,所以不担心我的技术。另外,他们这次想招的是技术总监或者系统架构师

自己动手写SQL执行引擎

北慕城南 提交于 2020-08-14 14:02:26
自己动手写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-14 03:38:05
如何提高数据库的访问性能,我们通常会想到 索引 或者 分库分表 等策略,下面以Mysql 为例解析下 索引 和 分库分表 的使用一些考虑 首先我们先了解什么是索引,以及索引的作用,要解决的问题。 PS:索引是一种排序的数据结构,为了提升数据的查询性能,索引数据本身也是存储在磁盘文件中。 一 索引的使用 1 Mysql中索引类型有哪些呢? 主键索引 --主键索引不可以为null 唯一索引 --可以有一个为null 全文索引 --通过 match against 查询命令支持文本匹配搜索的业务 2 Mysql 中索引数据结构有哪些? B+tree B Tree 由平衡二叉平衡树 ,降低树的高度变种为B Tree 通过节点的合并和分裂,降低树的高度; 充分考虑数据页DataPage的大小,充分利用逻辑区域内存 B+ Tree 每个节点存储的数量和定义的度一样,所以树的深度会降低 所有的父节点和分支节点不存储数据或者数据的指向磁盘地址 叶子节点指向了相邻节点的指针--不用重复从根节点访问 降低了数据的存储能力; 叶子节点本身是有序的数据,所以排序能力更好; Hash 通过hash码找到对应存储磁盘映射位置 hash支持等值,但对于范围值搜索不支持 3 Mysql 存储引擎有哪些呢,索引的存储结构是否会有不同呢? 存储引擎就是表数据存储的类型,以及以何种方式管理数据存储,对于不同的使用场景