B+Tree

深入了解Mysql索引

时间秒杀一切 提交于 2021-02-17 21:49:29
前言 欢迎关注我的微信公众号【 Mflyyou 】获取持续更新。 github.com/zhangpanqin/MFlyYou 收集技术文章及我的系列文章,欢迎 Star。 数据库中的索引是为了提高查询效率的,将像字典的目录一样。 当我们了解索引的原理之后,就没有必要去死记硬背所谓的 Mysql 军规之类的东西了。 本文内容 索引的类型:UNIQUE,FULLTEXT,SPATIAL,NORMAL(普通索引) 索引为什么会采用 B+ 树结构,为什么不是二叉树、B- 树 Mysql 中 B+ 树索引 和 Hash 索引应该选哪个 为什么索引的使用需要遵循 最左匹配原则 联合索引 、 聚簇索引 和 覆盖索引 分别是什么 索引添加的判断依据是什么 索引 Mysql 中常见的索引类型有: 普通索引 唯一索引 全文索引 空间索引 Mysql 中索引的数据结构有: B+Tree ,存储引擎 InnoDB 和 MyISAM 都支持。因为我们一般都是使用存储引擎 InnoDB 和 MyISAM ,我们都是使用 B+Tree 数据结构的索引。 HASH ,存储引擎 MEMORY 支持,存储引擎 InnoDB 和 MyISAM 不能手动定义 HASH 索引。 因此,我们详细了解 B+Tree 就行了。 我们先来介绍一下两种索引的数据结构的区别,感受一些各自的使用场景。 Hash 数据结构的索引

关于XFS文件系统概述

亡梦爱人 提交于 2021-02-16 10:51:38
前言: 目前XFS已成为Linux主流的文件系统,所以有必要了解下其数据结构和原理。 XFS文件系统 XFS是一个日志型的文件系统,能在断电以及操作系统崩溃的情况下保证数据的一致性。XFS最早是针对IRIX操作系统开发的,后来移植到linux上,目前CentOS 7已将XFS作为默认的文件系统。使用XFS已成为了潮流,所以很有必要了解下其数据结构和原理。 XFS官方说明文档参考: https://xfs.org/docs/xfsdocs-xml-dev/XFS_Filesystem_Structure//tmp/en-US/html/index.html 接下来将介绍XFS的一些概念,包括分配组、超级块、inode等等,过程中会结合xfs_db(xfs提供的输出文件系统信息的工具)打印一些信息,了解当前XFS的实时数据。 分配组(Allocation Group) XFS将空间分为若干个分配组,每个分配组大小相等(最后一个可能不等)。分配组包含有超级块、inode管理和剩余空间管理等,所以分配组可以认为是一个单独的文件系统。正是分配组这样的设计,使得XFS拥有了并行IO的能力。在单个分区上使用XFS体现不了这种并行IO能力,但是如果文件系统跨越多个物理硬件比如ceph,并行IO将大大提高吞吐量利用率。 上图为分配组的结构图,重点关注前面4个扇区,从上到下分别为超级块、空闲块信息

一周学习小总结,MySQL进阶~

一笑奈何 提交于 2021-02-04 04:55:37
今天的这篇推文,是对前六天MySQL学习的一个进阶学习和小总结,前两天是端午节,大家过得如何?休息之余,不要忘记坚持学习,加油! 不同岗位对MySQL的技术要求 对于不用的岗位,我们对MySql的技术要求不同。 数据分析岗位,侧重查询和多表关联的复杂查询。对于数据分析来说,主要掌握查询,取数据,不关心性能。 数据库开发,程序员岗,注重设计系统,包括表的设计,增删改查,懂得数据库进行查询的原理,依据统计信息对查询进行性能优化,处理非常大的数据量的的查询,SQL的语言的复杂性较数据分析师的高。 DBA-数据库管理员,连接、配置服务器,保证SQL的服务性能、稳定性,修改慢查询,此外,数据库的集群管理,机房服务器连接的一致性管理也是重点。 Python操作MySQL 主要使用库:Python DB-API 常用模块: MySQLdb :MySQL-Python,底层C语言实现,在Python2版本中使用多 mysql-connector : MySqL官方提供,使用不是很友好 pymysql:使用Python实现,Python三版本以上使用, 主要使用pymysql 基本操作 连接数据库 import pymysql db = pymysql.connect(host='',port=3306) 获取游标 cs = db.cursor() Cursor是游标,指针的意思

吃透MySQL(三):MyISAM和InnoDB存储引擎详细介绍

最后都变了- 提交于 2021-01-31 11:16:46
一,MySQL基本架构 MySQL基础架构可以分为两大类:Server层和存储引擎层。 Server层: Server层涵盖了MySQL大部分核心业务功能,并且所有存储引擎的功能都在这一层实现。 存储引擎层:存储引擎有很多,各自有着各自的特点,可以根据场景来选择不同的存储引擎来操作数据 连接器:负责跟客户端建立连接,获取权限,维持和管理连接。包括用户名和密码的验证,查询权限信息,分配对应的权限,可以使用 show processlist 查看现在的连接,如果太长时间没有动静,就会自动断开,通过wait_timeout控制,默认8小时。 分析器:词法分析:MySQL需要把输入的字符串进行时别,每个部分代表什么意思,比如,把字符串 T 识别成表名 T,把字符串 ID 识别成列 ID。语法分析:根据语法规则判断这个sql语句是否满足MySQL的语法,如果不符合就会报错“You have an error in your SQL synta”。 优化器:在具体执行SQL语句之前,要先经过优化器的处理。当表中有多个索引的时候,决定用哪个索引,当sql语句需要做多表关联的时候,决定表的连接顺序等等。 执行器:通过分析器知道了做什么,通过优化器知道了怎么做,这就遇到了一个问题,谁来做?可想而知就是执行器开始执行SQL语句。开始执行的时候,要先判断一下你对表是否有执行查询的权限

MySQL高级-索引

喜欢而已 提交于 2021-01-18 11:22:03
1.索引概述 MySQL官方对索引的定义为: 索引(index)是帮助MySQL高效获取数据的数据结构(有序) 。在数据之外,数据 库系统还维护者 满足特定查找算法的数据结构 ,这些数据结构以某种方式引用(指向)数据, 这样就可以在这些数 据结构上实现高级查找算法,这种数据结构就是索引 。如下面的示意图所示 : 提炼观点: 索引是什么?索引是一种数据结构 作用是什么?高效获取数据 左边是数据表,一共有两列七条记录,最左边的是数据记录的物理地址(注意逻辑上相邻的记录在磁盘上也并不是 一定物理相邻的),(而其中的col1表示序号,col2我们认为是一个主键。)为了加快Col2的查找,可以维护一个右边所示的二叉查找树, 每个节点分别包含索引键值和一 个指向对应数据记录物理地址的指针,这样就可以运用二叉查找快速获取到相应数据。 (顺序查找时间复杂度一般为O(N),而二叉树查找时间复杂度优化情况下可以达到O(logN)) 举个例子:我们要查找3这个数据,在不加索引的时候需要遍历整张表,查找7次,加索引之后只需查找3次即可。 一般来说索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储在磁盘上。索引是数据 库中用来提高性能的最常用的工具。 2.索引优势劣势 优势 1) 类似于书籍的目录索引, 提高数据检索的效率,降低数据库的IO成本 。 2) 通过索引列对数据进行排序,

MySQL基础架构之查询语句执行流程

…衆ロ難τιáo~ 提交于 2021-01-18 06:53:49
这篇笔记主要记录mysql的基础架构,一条查询语句是如何执行的。 比如,在我们从student表中查询一个id=2的信息 select * from student where id=2; 在解释这条语句执行流程之前,我们看看mysql的基础架构。 图来自极客时间的mysql实践,该图是描述的是MySQL的逻辑架构。 server层包括连接器、查询缓存、分析器、优化器、执行器涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视等。 存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持InnoDB、MyISAM、Memory 等多个存储引擎,平常我们比较常用的是innoDB引擎 连接器 我们在使用数据库之前,需要连接到数据库,连接语句是 mysql -h $ip -u $username -p $password 而我们的连接器就是处理这个过程的,连接器的主要功能是 负责跟客户端建立连接、获取权限、维持和管理连接 ,连接器在使用的过程中如果该用户的权限改变,是不会马上生效的,因为用户权限是在连接的时候读取的,只能重新连接才可以更新权限 连接器与客户端通信的协议是 tcp 协议的,连接以后可以使用 show processlist; 看到执行的连接数 同时在连接时间内超过8小时是sleep的状态会自动断开

560字带你彻底搞懂:MySQL的索引优化分析

风格不统一 提交于 2021-01-16 23:53:55
正文 一、SQL分析 性能下降、SQL慢、执行时间长、等待时间长 查询语句写得差 索引失效 关联查询太多join(设计缺陷) 单值索引 :在user表中给name属性创建索引,create index idx_name on user(name); 复合索引 :在user表中给name、email属性创建索引,create index idx_name_email on user(name,email); 服务器调优 及各个参数设置(缓冲、线程数等) 二,join查询 1,SQL执行顺序 a)手写SQL b)机读 c)总结 2,JOIN查询 a)建表语句 b)满足条件的join语句 #左连接 SELECT * FROM tbl_dept t1 LEFT JOIN tbl_emp t2 on t1.id = t2.deptId; #右连接 SELECT * FROM tbl_dept t1 RIGHT JOIN tbl_emp t2 on t1.id = t2.deptId; #内连接(交集) SELECT * FROM tbl_dept t1 INNER JOIN tbl_emp t2 on t1.id = t2.deptId; #左连接(只取A独有的) SELECT * FROM tbl_dept t1 LEFT JOIN tbl_emp t2 on t1.id = t2

mysql索引及调优

五迷三道 提交于 2021-01-13 15:54:03
1. 索引数据结构设相关的计算机原理   1、计算机主存和外部存 介绍       1. 在计算机系统中一般包含两种类型的存储,计算机主存(RAM)和外部存储器(如硬盘、CD、SSD等)。       2. 在设计索引算法和存储结构时,我们必须要考虑到这两种类型的存储特点。       3. 主存的读取速度快,相对于主存,外部磁盘的数据读取速率要比主从慢好几个数量级,具体它们之间的差别后面会详细介绍。       4. 上面讲的所有查询算法都是假设数据存储在计算机主存中的,计算机主存一般比较小,实际数据库中数据都是存储到外部存储器的。   2、如何评价索引性能       1. 一般来说,索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储的磁盘上。       2. 这样的话,索引查找过程中就要产生磁盘I/O消耗,相对于内存存取,I/O存取的消耗要高几个数量级。       3. 所以评价一个数据结构作为索引的优劣最重要的指标就是在查找过程中磁盘I/O操作次数的渐进复杂度。       4. 换句话说,索引的结构组织要尽量减少查找过程中磁盘I/O的存取次数。   3、主存存取原理        注: 这里本文抛却具体差别,抽象出一个十分简单的存取模型来说明RAM的工作原理       1. 从抽象角度看,主存是一系列的存储单元组成的矩阵

每日一面

删除回忆录丶 提交于 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

牛批!一张6000w数据表的查询优化到0.023s

余生颓废 提交于 2020-12-24 19:32:46
“ 我司系统中有一个专门存车流量的库(没有主键),其中一个历史表数据量太大,表空间占据太大,每天有 500w 的数据写入。 详细需求 老大给我安排了个任务,让我写个按天分表的定时任务,每次把一天的数据转移到按天生成的表中,并删除原表中的数据,主要目的是不想再增长表空间了,保持一个平衡,因为每天删 500w 也会加 500w。 表空间和数据量如下图: 实现思路 实现做法流程,如图: 实现伪代码(删减了部分代码): /** * 转移数据 每天凌晨3点 每次只能转移一天的数据 */ @Scheduled(cron = "0 0 3 * * ?" ) public void dataTransfer ()throws Exception { System. out .println( "定时器开始运行------------------------------------------" ); String tabaleName = "XXX" ; String isTable = getTableName(tabaleName); // 当返回为空时,代表该表不存在,则创建 if (ObjectUtils.isNull(isTable)){ createHistoryDate(names); } // 得到最远的时间段 Map<String, Object> orderTime =