自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(135)
  • 收藏
  • 关注

原创 算法入门之散列表简介

散列表又被称为哈希表,包含一个键key、一个值value它们之间的对应关系是一对一,散列表就提供了键key和值value的对应关系,基本结构如下。键值不会重复所以通过键就可以找到与之对应的值,一般散列表查询的时间复杂度为O(1),那么为什么散列表会这么快呢?

2022-10-25 23:37:54 353 1

原创 算法入门之树简介

像我们熟知的栈、队列、散列表等这些都是一对一存储称为线性结构,但在现实生活中不可避免的会用到一对多的场景,基于这些场景聊聊这些一对多的解决方案,树或者图这些都是非线性存储。树在现实生活中给我们的印象是一条主干多条分支,这些分支上再去延申在其末端长出树叶,如下。在数据结构中同样有类似定义,那么如何定义数据结构中的树呢?

2022-10-01 20:23:32 633

原创 JAVA8时间工具类转换

转换过程总结起来相对简单,Date类和JDK1.8推出的LocalDate、LocalDateTime、LocalTime类之间的转换可以通过ZonedDateTime做桥梁,至于JDK1.8新出的类就可以通过API自己转换,转换细节如图所示。

2022-09-29 10:23:39 1423

原创 JAVA8时间工具类

因为JDK1.7的时间工具类Date和Calendar存在安全性问题,同时大多数API 都已过时,所以JDK1.8重新规划了时间工具类,这些工具类的核心如下Instant:瞬时实例。LocalDate:本地日期,不包含具体时间 例如:2020-01-01。LocalTime:本地时间,不包含日期。LocalDateTime:组合了日期和时间,但不包含时差和时区信息。ZonedDateTime:最完整的日期时间,包含时区和相对UTC或格林威治的时差。Duration:表示一个时间段。

2022-09-29 10:20:37 704

原创 JAVA时间存储类Period和Duration

在JDK1.8中区分了时间和日期的概念,所以有了两个对应的类,LocalDate和LocalTime,区别如下LocalDate表示日期,不会包含具体的时间,例如2022-09-26。LocalTime表示时间,不会包含日期,仅仅包含时分秒。简单使用如下区分了时间和日期的概念后,为方便使用JDK1.8又推出了两个用于存储时间和日期的类,分别为Duraction和Period,这两个类的区别和LocalDate和LocalTime是一一对应的。

2022-09-27 11:40:25 429

原创 JAVA时间戳类Instant

在JAVA8之前的版本,去获取时间戳(毫秒级别)常用的办法有两种由于Date类大部分方法已经废弃,而且上面两种方法的时间戳只能精确到毫秒级别,所以我们有必要了解下jdk1.8推出的Instant类,该类可以将时间戳精确到级别。

2022-09-26 20:25:35 1564

原创 算法入门之队列

队列和栈及其类似,队列在现实生活中的例子就是隧道,单通道一条线,先进去的先出来,后进去的后出来。在算法中的队列也是这样队列中从队头位置出队,从队尾入队,队列中的元素永远是先入先出FIFO(简称First In First Out)。队列的实现方式同样有两种数组和链表,实现队列的结构图如下(上面是数组实现,下面是链表实现)

2022-09-21 11:48:44 414

原创 算法入门之栈

栈是一种线性结构,最常见的生活中的例子就是羽毛球筒羽毛球筒只开放一端入口,那么先放入的球一定是在底部,最后放入的球在最顶部,拿球时先获取的就是靠近顶部的球,只有不停的获取才能将底部的球拿到。栈也就是这样,只能从一端入栈和出栈,这种顺序我们称为FILO(First In Last Out)先进后出,最早进入的元素称为栈底,最后进入的元素我们称为栈顶,如下栈是链表和数组的基本数据的衍生结构,所以可以采用链表或者数据实现,具体思路如下。

2022-09-21 11:18:52 241

原创 算法入门之链表简介

链表为数据结构中第二种基本结构,一般链表就是指在物理结构上非连续,非有序的数据结构,链表又分为单向链表和双向链表,单向链表一般可以如下定义结构图如下因为单向链表搜索顺序只能由左到右,显然对检索效率有一定影响,这时候就要推出双向链表,顾名思义就是在单项链表的基础上新增一个prev前指针既可以向前搜索也可以向后搜索,定义如下结构图如下。

2022-09-19 10:49:50 139

原创 算法入门之数组简介

数组是算法中最简单、最常用的线性结构,那么数组的定义是什么呢?首先是一片连续的空间,用来存放的数据集合,这就称为数组。

2022-09-19 10:47:31 143

原创 空间复杂度

空间复杂度是对程序执行过程中临时占用空间大小度量的指标,一般空间复杂度表示为S(n) = O(f(n)),其中n表示输入规模,fn表示一段程序代码。空间复杂度和时间复杂度的有类似的情形如下。

2022-09-16 22:00:32 432

原创 时间复杂度

我们在程序开发过程中为了衡量一个算法的好坏制定了两个标准和,因为程序运行的时间长短和占用内存的大小直接影响到程序的执行效率。但我们需要注意程序运行的时间长短不仅仅取决于代码,还有运行环境、硬件、数据量等因素影响,什么意思呢?:当一段相同的代码同时在2C4G和4C8G上的机器运行因为机器计算力不一样,所以程序运行时间大概率不同(特别是代码计算量大时)。:当一台机器上大部分资源被其它服务所占用,另外一台机器上面没有其它服务,那么一段相同的代码在两个硬件相同机器上执行时间长短会不一样。

2022-09-16 21:43:41 499

原创 Mysql和文件系统的关联

在Linux中采用文件系统管理磁盘,而Mysql常用的存储引擎如InnoDB、MyISAM采用的是文件存储,自然和文件系统挂钩,那么Mysql都有哪些地方用到了文件系统呢?下面聊聊。

2022-09-06 23:26:27 212

原创 B+树索引(13)之索引挑选(下)

上篇文章简单聊了索引选择的几点如只为搜索、排序、分组相关列建立索引,即使是显示列(select)也不考虑。尽量避免为基数太小的列建立索引,区分度太低索引可能不生效(如性别字段最多只有男、女、其它三种值,区分度太低)。索引列尽可能的少占用空间,特别是主键索引因为占用空间太多将影响聚簇索引、二级索引的存储和搜索效率。文章链接参考这篇文章是对索引挑选进行一个补充。...

2022-08-30 23:44:24 122

原创 B+树索引(12)之索引前缀

前缀索引是索引中特殊的一种,根据字面意思上解释它是对文本前几个字符建立索引(具体是几个可以通过语句控制),这样做的好处很明显可以让索引占用字段变小,节约索引空间,减少磁盘IO的性能损耗,数据页存储记录数量增加。但是!这里需要注意的是前缀索引是一把双刃剑,虽然节约了索引空间,但会导致索引的选择性降低。...

2022-08-29 23:49:52 231

原创 B+树索引(11)之索引挑选(上)

之前的文章从索引的基本结构聊到索引存储又聊到索引的适用场景,我们已经对索引有了一个大致的认识,索引相关文章参考这次我们聊聊怎么去选择索引,一个正确的索引可以花最小的代价换取最大的性能!...

2022-08-27 23:01:58 174

原创 B+树索引(10)之回表的代价

回表操作一般发生在二级索引中,查询的列不全部包含在二级索引中,需要根据二级索引叶子节点中的主键id,再去聚簇索引中查询完整的用户数据,这个查询过程称为回表。如存在测试表person_info同时二级索引也被称为组合索引的idx_name_birthday_phone_number数据索引结构如下B+树叶子节点中包含name、birthday、phone_number、id不包含country列,如果存在如下SQL。...

2022-08-26 23:08:07 252

原创 B+树索引(9)之索引应用排序的注意事项

前面有两篇文章讲解了索引的适用场景,包含全值匹配、最左匹配、左前缀匹配、范围查找、排序、分组等,相关文章参考如下链接其中提到了因为索引树的数据页和数据页之间采用主键或者指定列排序,数据页的记录与记录之间采用相同方式排序,正是因为这一特性,所以索引可以用于排序,为了文章的完整性这里贴出之前文章提到的测试表以及组合索引idx_name_birthday_phone_number的数据结构。...

2022-08-25 22:54:39 338

原创 B+树索引(8)之索引适用场景(下)

在上篇文章中提到了索引适用场景的一部分包括全值匹配原则、最左匹配原则、匹配列前缀原则这三个适用场景,相关文章参考如下为方便理解还需要提到上篇文章的演示表person_info以及组合索引idx_name_birthday_phone_number的B+索引树基本结构。

2022-08-24 14:08:19 123

原创 B+树索引(7)之索引适用场景(上)

前面索引相关的文章都是侧重讲解索引的结构,索引数据存储方式、保存的逻辑、B+树的构成等等,后面开始聊聊如何正确使用索引,因为不正确的使用索引是会让索引失效的,相关索引文章参考如下。为了讲解方便创建测试表person_info,个人信息表该表包含两个索引一个是主键索引也称为聚簇索引,第二个索引称为组合索引就是二级索引该索引包含三个字段,分别为name, birthday, phone_number,在之前的文章中我们提到过组合索引排序规则如下。

2022-08-23 22:43:58 229

原创 索引的代价

一谈到Mysql表的性能优化,谈及最多的就是加索引,但索引虽好但不能随意创建,创建一个索引会带来时间上和空间上的性能消耗,所以我们在创建索引时需要尽量将索引发挥出最大的性能!

2022-08-22 23:01:00 230

原创 B+树索引(6)之MyISAM索引方案

了解完这些后就会发现InnoDB和MyISAM存储引擎的另外两个不同点InnoDB存储引擎的数据和主键索引信息一起存放,而MyISAM存储引擎分开存放。InnoDB数据存储文件为:frm表定义文件,ibd表数据文件,MyISAM数据存储文件为:frm表定义文件,myd数据文件,myi索引文件。MyISAM的索引方案当然存在很多存储细节,但我们主要以InnoDB存储引擎为主,所以简单了解即可。

2022-08-21 16:55:20 398

原创 B+树索引(5)之索引注意事项

在前面的文章中我们可以聊了很多索引相关知识,具体内容详情可以参考但随着深入学习我们知道索引并不只是B+树那么简单,而是一个复杂的结构,所以今天来聊聊索引的注意事项。

2022-08-20 17:02:32 221

原创 B+树索引(4)之索引分类

在前面的文章中我们可以简单推导出索引的形成过程,具体内容详情可以参考演示表的基本结构如下所示根据演示表得出主键索引的简单结构如下所示整个主键索引或者说B+树由数据页构成,当然数据页中采用记录头属性record_type区分了是业务记录还是目录项记录,0为业务记录,1为目录项记录。了解完这些我们就可以来聊聊索引的类型。...

2022-08-18 23:13:16 160

原创 B+树索引(3)之索引推导优化

在B+树中我们将这些数据页称为节点,我们可以从上图中看出所有的业务数据只会存储到树的最底层,这些节点被称为叶子节点,而剩余的目录项数据页被称为非叶子节点,最顶层的数据页被称为根节点。不知道大家有没有这种疑问,B+树遍历数据页的次数就是树的高度,也就是树越高需要遍历数据页的次数就越多,这样是不是也会影响查询速度呢?这样直接看文字肯定是合理的,但我们可以做一个简单的分析。...

2022-08-17 21:25:05 150

原创 B+树索引(2)之索引的推导

这里需要注意的是分配的空间可能不连续,所以只能通过数据页的File Header的上一页下一页关联,为了让数据页有规律性,那么数据页中的记录显然也是要有规律,我们可以暂定上一页主键的最大值需要小于下一页主键的最小值,上面数据页10的最大主键值为5,数据页8的最大主键值为4,显然不符合这种规定,那么我们就需要将记录转移,使数据页符合规则,这个过程被称为页分裂。最终结果如下。...

2022-08-16 20:12:03 318

原创 B+树索引(1)之为什么需要索引

通过之前的文章我们知道InnoDB用于存储业务数据的页被称为数据页,而数据页的7大结构中的File Header结构中有上一页(FIL_PAGE_PREV)下一页(FIL_PAGE_NEXT)用来关联不连续的数据页,所以就可以形成如下所示的双向链表。...

2022-08-15 22:48:49 242

原创 InnoDB数据页结构(5)之其它结构

我们知道InnoDB数据页的基本结构如下所示在前期文章中我们聊了最小记录、最大记录、用户记录、页面目录的详细结构,往期文章参考至于剩下的几部分就相对简单了,下面简单了解即可。

2022-08-14 22:26:11 466

原创 InnoDB数据页结构(4)之页目录

InnoDB存储引擎的数据页结构如下所示之前有聊过最小记录、最大记录、用户记录结构,其中用户记录中的记录头信息存在值,当时的解释是为了单链表检索效率,所以将链表分为若干组,每个组的最大记录的值用于记录该组的记录数量,测试表结构和测试数据如下所示测试表数据记录头结构如下所示测试表包含两个数据组最小记录infimum所在记录,只有自身一条记录。最大记录supremum所在记录,自身一条记录和四条业务记录所以n_owned才为5从这里并不能很明确的看出分组后对于检索后有何优势,那具体如何做的呢?...

2022-08-13 10:21:00 296

原创 InnoDB数据页结构(3)之记录头信息分析

在之前的文章中有分析得到记录头每个部分的二进制值如下所示对应表数据如下所示下面来具体分析下这些值的具体含义(当然不包含预留位1和预留位2)

2022-08-11 23:14:27 197

原创 InnoDB数据页结构(2)之记录头信息解析

之前聊了InnoDB数据页的结构由7部分组成,如下所示现在将以记录为切入点讲解,先来聊聊记录头信息,在用户记录中每条数据都包含一个记录头信息,以COMPACT行结构为例,结构图如下所示记录头用于描述记录信息,一般由5个字节40位构成,结构如下在之前的文章中有搭建过分析数据表详情参考表结构如下表数据如下根据测试表page_demo能够得到ibd文件如下分析信息。...

2022-08-10 22:21:16 151

原创 InnoDB数据页结构(1)环境搭建

之前有提过Mysql数据库内存空间和磁盘空间交互为了高效一般采用页的形式传输,每个页通常的大小为16kb,页的形式有很多种,但我们最需要了解的是存放业务数据的页简称数据页,下面聊聊数据页的基本结构。...

2022-08-09 18:45:58 194

原创 InnoDB行格式(4)行溢出和溢出页

我们应该知道Mysql中内存和磁盘之间的数据交互并不是以记录行为单位而是以页为单位,因为内存和磁盘间的处理速度差了几个数量级,单次读取一条记录那么Mysql无法高效运行,所以Mysql都是以页为基本单位管理存储空间的,我们的记录都会被分配到某个页中存储,一个页的大小一般为16kb,那么可以存储多少字节的数据呢?16kb=16*1024=16384字节‬我们上章聊过,当一个varchar类型在字符集为ascii下最大可以存储的字节长度为65532,具体计算可以参考。...

2022-08-01 19:37:21 366

原创 InnoDB行格式(3)VARCHAR最多能存储的数据

我们知道在InnoDB存储引擎中,行格式Compact、Compressed、Dynamic都会计算变长字段VARCHAR长度列表,这个字段长度一般采用两个字节表示,也就是VARCHAR能表示的最大长度应该是2的16次方(因为一个字节8位,两个字节16位能表示的最大值是65535),那么65535个字节长度是否能存放呢?测试案例如下分析很明显错误信息提示,我们列c设置的长度太长,注意**MySQL对一条记录占用最大的空间有限制,所有列(不包含隐藏列和记录头信息)长度之和需要小于65535,当然这并不包含

2022-07-30 10:43:16 168

原创 InnoDB行格式(2)存储行格式COMPACT结构分析

基于InnoDB存储引擎的COMPACT行结构存储结构分析

2022-07-28 22:36:25 293

原创 InnoDB行格式(1)

我们知道在Mysql的服务端分为了server层和存储层,其中存储层负责对表数据进行读取和写入,这个工作由存储引擎完成,在Mysql中分为多种存储引擎如InnoDB、MyISAM、Memory等,其中InnoDB是默认的存储引擎,下面以InnoDB存储引擎为例来分析。,验证如下。其中行格式Compact、Dynamic、Compressed三者行格式存储类似,在详细分析前先搭建验证环境。...

2022-07-26 23:51:35 159

原创 py_innodb_page_info分析ibd文件信息

py_innodb_page_info工具是《MySQL技术内幕InnoDB存储引擎》作者用来分析Mysql表空间的各页的类型和数据,此工具采用python编写,github地址如下https通过README.md文件我们可以知道安装此工具前需要先安装python环境,步骤如下。...

2022-07-25 23:48:41 516

原创 Mysql客户端到服务端字符集的转换

Mysql客户端和服务端之间的通信请求本质上是一个字符串,当然这个字符串会通过某种字符集编码转换为二进制数据,那是不是客户端和服务端之间的通信就只有一个字符集编码呢?如下所示。

2022-07-23 11:34:03 186

原创 字符集和比较规则的应用

Mysql对字符集的应用分为以下四个方面。

2022-07-21 19:15:18 187

原创 Mysql字符集和排序规则

举例如下,假设存在编码集test,只能识别a,b,A,B这几项,同时编码规则如下那么字符串’aAB’可以映射为000000010000001100000100(十六进制0x10304)而ac将无法转换,因为超出了识别范围。上面提到的将字符串根据字符集映射为二进制的过程称之为编码,反之就为解码。那什么是比较规则呢?...

2022-07-20 22:14:39 423

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除