自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Mysql执行计划

这种情况下,需要检查WHERE语句中所使用的的列,看是否可以通过给这些列中某个或多个添加索引的方法来提高查询性能。这是查询中SELECT的序号。ref列显示了在key列记录的索引中表查找值所⽤到的列或常量,常见的有:const(常量),func,null,字段名。这列包含了MySQL解析查询的额外信息,通过这些信息,可以更准确的理解 MySQL 到底是如何执行查询的。rows列表示根据表统计信息及选用情况,大致估算出找到所需的记录或所需读取的行数,数值越小越好。查询执行的类型,描述了查询是如何执行的。

2024-12-05 21:20:42 844

原创 Mysql锁

由于表级锁一次会将整个表锁定,是针对非索引字段加的锁,所以可以很好的避免困扰我们的死锁问题。行级锁定最大的特点就是锁定对象的粒度很小,是针对索引字段加的锁,只对当前操作的行记录进行加锁。共享锁的特性主要是为了支持并发的读取数据,读取数据的时候不支持修改,避免出现重复读的问题。意向锁和共享锁和排它锁互斥(这里指的是表级别的共享锁和排他锁,意向锁不会与行级的共享锁和排他锁互斥)。操作,读取操作不会因此去等待记录上X锁的释放,而是会去读取行的一个快照。的行锁是针对索引字段加的锁,表级锁是针对非索引字段加的锁。

2024-12-05 21:20:16 686

原创 Mysql读写分离&分库分表

读写分离主要是为了将对数据库的读写操作分散到不同的数据库节点上。这样的话,就能够小幅提升写性能,大幅提升读性能。一般情况下,我们都会选择一主多从,也就是一台主数据库负责写,其他的从数据库负责读。主库和从库之间会进行数据同步,以保证从库中数据的准确性。这样的架构实现起来比较简单,并且也符合系统的写少读多的特点。分库就是将数据库中的数据分散到不同的数据库上,可以垂直分库,也可以水平分库。垂直分库就是把单一数据库按照业务进行划分,不同的业务使用不同的数据库,进而将一个数据库的压力分担到多个数据库。

2024-12-03 21:38:44 1267

原创 Mysql事务

简单来说,数据库事务可以保证多个对数据库的操作构成一个逻辑上的整体,这些数据库操作遵循着要么全部执行成功,要么全部不执行。MySQLSQL ServerOracleAtomicityIsolationDurability👉 只有保证了事务的持久性、原子性、隔离性之后,一致性才能得到保障。也就是说 A、I、D 是手段,C 是目的!而对于这四大特性,实际上分为两个部分。其中的原子性、一致性、持久化,实际上是由InnoDB中的两份日志来保证的,即redo log和undo log。

2024-12-03 21:38:13 914

原创 Redis持久化详解AOF&RDB

在fork出子进程时的拷贝,以及在重写时,如果有新数据写入,主线程就会将命令记录到两个aof日志内存缓冲区中。混合持久化工作在 AOF 日志重写过程,当开启了混合持久化时,在 AOF 重写日志时,fork 出来的重写子进程会先将与主线程共享的内存数据以 RDB 方式写入到 AOF 文件,然后主线程处理的操作命令会被记录在重写缓冲区里,重写缓冲区里的增量命令会以 AOF 方式写入到 AOF 文件,写入完成后通知主进程将新的含有 RDB 格式和 AOF 格式的 AOF 文件替换旧的的 AOF 文件。

2024-12-01 10:32:26 725

原创 Mysql索引(二)

正因如此,红黑树的查询效率稍有下降,因为红黑树的平衡性相对较弱,可能会导致树的高度较高,这可能会导致一些数据需要进行多次磁盘IO操作才能查询到,这也是MySQL没有选择红黑树的主要原因。如果数据都存储在内存中,采用AVL树来存储,还是可以的,查询效率非常高。不过我们的数据是存在磁盘中,采用这种结构,每个节点对应一个磁盘块,数据量大的时候,也会和二叉树一样,会导致树的高度变高,这样逻辑上很近的节点实际可能非常远,无法很好的利用磁盘预读(局部性原理),会增加IO次数,所以用这种结构存储数据也是不可取的。

2024-12-01 10:23:44 827

原创 Mysql索引(一)

索引是存储引擎用于快速找到记录的一种数据结构。举个例子:如果查找一本书中的某个特定主题,一般会先看书的目录(类似索引),找到对应页面。在MySQL,存储引擎采用类似的方法使用索引,高效获取查找的数据。索引的分类从存储结构上来划分Btree索引(B+tree,B-tree)hash哈希索引full-index全文索引从应用层次上来划分普通索引:一个索引只包含单个列,一个表可以有多个普通索引唯一索引:索引列的值必须唯一,但允许有空值复合索引:一个索引包含多个列。

2024-12-01 10:08:08 903

原创 SQL执行原理

TCP 网络连接建立成功后,服务端与客户端之间会建立一个session会话,紧接着会对登录的用户名和密码进行效验,首先会查询自身的用户表信息,判断输入的用户名是否存在,如果存在则会判断输入的密码是否正确。如果我们所需要的数据是随机分散在不同页的不同扇区中,那么找到相应的数据需要等到磁臂旋转到指定的页,然后盘片寻找到对应的扇区,才能找到我们所需要的一块数据,依。假设我们已经找到了第一块数据,并且其他所需的数据就在这一块数据后边,那么就不需要重新寻址,可以依次拿到我们所需的数据,这个就叫顺序 IO。

2024-12-01 10:05:32 1001

原创 Mysql后台线程

在InnoDB的后台线程中,分为4类,分别是:Master Thread 、IO Thread、Purge Thread、Page Cleaner Thread。

2024-11-30 13:55:51 266

原创 InnoDB磁盘架构

关于MysqlInnodb引擎对底层页的一次原子访问的过程叫做。什么意思呢?我们来举一个例子,假如我们在有索引的数据表中插入一条记录,那么我们需要在Innodb引擎的聚簇索引B+树的数据页中插入这条记录,更改这条记录的上一条记录的的内容,使其指向这条记录;然后还需要在辅助索引B+树的数据页的中插入这条记录的索引信息;上边描述的这个过程就称为对底层页的一次原子访问,也就是说这次原子访问可能修改了多个数据页的信息,这个过程是不可分割的。

2024-11-30 13:54:53 948

原创 InnoDB内存架构

MySQL5.5 版本开始,默认使用InnoDB存储引擎,它擅长事务处理,具有崩溃恢复特性,在日常开发中使用非常广泛。下面是InnoDB架构图,左侧为内存结构,右侧为磁盘结构。

2024-11-29 15:08:04 844

原创 InnoDB逻辑存储结构

大家都知道mysql中数据是存储在物理磁盘上的,而真正的数据处理又是在内存中执行的。由于磁盘的读写速度非常慢,如果每次操作都对磁盘进行频繁读写的话,那么性能一定非常差。为了解决上述问题,InnoDB将数据划分为若干页,以页作为磁盘与内存交互的基本单位,一般页的大小为16KB。这样的话,一次性至少读取1页数据到内存中或者将1页数据写入磁盘。通过减少内存与磁盘的交互次数,从而提升性能。如果一条数据正在被使用,那么在接下来一段时间内大概率还会再被使用。可以认为热点数据缓存都属于这种思路的实现。

2024-11-29 14:08:24 1067

原创 Mysql数据类型

在MySQL中支持的主要整数类型是和BIGINT。这些类型在很大程度上是相同的,只有它们存储的值的大小是不相同的。MySQL以一个可选的显示宽度指示器的形式对 SQL 标准进行扩展。当从数据库检索一个值时,可以把这个值加长到指定的长度。例如,指定一个字段的类型为 INT(6),就可以保证所包含数字少于 6 个的值从数据库中检索出来时能够自动地用空格填充。需要注意的是,使用一个宽度指示器不会影响字段的大小和它可以存储的值的范围。

2024-11-03 20:46:14 1056

原创 Mysql开发规范

命名规范的对象,是指数据库SCHEMA、表TABLE、字段COLUMN、索引INDEX、约束CONSTRAINTS等。

2024-11-03 20:22:47 732

原创 Redis事务

Redis 事务的本质是一组命令的集合。事务支持一次执行多个命令,一个事务中所有命令都会被序列化。在事务执行过程,会按照顺序串行化执行队列中的命令,其他客户端提交的命令请求不会插入到事务执行命令序列中。总结说:redis事务就是一次性、顺序性、排他性的执行一个队列中的一系列命令。事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。

2024-08-28 22:12:11 1001

原创 Redis持久化

在fork出子进程时的拷贝,以及在重写时,如果有新数据写入,主线程就会将命令记录到两个aof日志内存缓冲区中。混合持久化工作在 AOF 日志重写过程,当开启了混合持久化时,在 AOF 重写日志时,fork 出来的重写子进程会先将与主线程共享的内存数据以 RDB 方式写入到 AOF 文件,然后主线程处理的操作命令会被记录在重写缓冲区里,重写缓冲区里的增量命令会以 AOF 方式写入到 AOF 文件,写入完成后通知主进程将新的含有 RDB 格式和 AOF 格式的 AOF 文件替换旧的的 AOF 文件。

2024-08-27 20:55:55 906

原创 Redis底层数据结构

跳跃表(skiplist)是一种有序数据结构,它通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的。它的效率和红黑树以及 AVL 树不相上下,但实现起来比较容易。是一种可以于平衡树媲美的层次化链表结构——查找、删除、添加等操作都可以在对数期望时间下完成。跳跃表支持平均O (LogN)、最坏O(N) 复杂度的节点查找,还可以通过顺序性操作来批量处理节点。在大部分情况下,跳跃表的效率可以和平衡树相媲美,并且因为跳跃表的实现比平衡树要来得更为简单,所以有不少程序都使用跳跃表来代替平衡树。

2024-08-26 21:19:11 1128

原创 基本数据类型及命令

zset和set一样也是string类型元素的集合,且不允许重复的元素,不同的是每个元素都会关联一个double类型的分数,redis通过分数来为集合中的元素进行排序,zset中元素是唯一的但是分数可以重复。Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的并且是很小的。Set是string类型的无序唯一集合,集合是通过hash表实现的,所以添加,删除,查找的复杂度都是O(1)。

2024-08-25 22:13:06 772

原创 2023「总结」,2024「展望」

时光荏苒,岁月如梭,转眼已经进入2024年了。回想过去的2023年,成长了很多,有收获,有付出,也有一丝丝的遗憾。其实在写这篇文章之前我思考了很久,一直不知如何下手,也许这是一个新手都会遇到的问题,这也是我第一次做年度复盘。所以我看了很多网友的复盘帖并从中学习一些复盘经验,不断总结自己这一年的经历。对自己在过去的2023年从多个方面进行了总结。

2024-01-06 14:26:53 458

原创 16、Mysql用户工具

接口工具Mysql WorkbenchSQLyogphpMyAdminAdminer命令行工具集Percona ToolkitMaatkit and AspersaThe openark kitMysql Workbench工具集SQL实用集common_schemamysql-sr-libMysql UDF库Mysql Forge监测工具开源的监控工具NagiosZabbixZenossHyperic HQOpenNMSGroundwork Open Sourc

2024-01-02 21:08:57 422

原创 15、备份与恢复

备份在先,只有已经做了备份才可能恢复。备份由脚本和任务自动完成。备份是日常任务,但是恢复常常发生在危急情况下。因为安全的需要,如果正在做异地备份,可能需要对备份数据进行加密或采取其他措施来保护。只有一个人来规划、设计和实施备份。规划备份和恢复策略时,有两个重要的需求可以帮忙思考:恢复点目标和恢复时间目标。他们定义了可以容忍丢失多少数据,以及需要等待多久将数据恢复。

2024-01-02 21:02:30 1109

原创 14、应用层优化

缓存对高负载应用来说是至关重要的,一个典型的Web应用程序会提供大量的内容,直接生成这些内容的成本比采用缓存要高得多,所以采用缓存通常可以获得数量级的性能提升。因为应用可以缓存部分计算结果,所以应用层缓存可能比更低层次的缓存更有效。在更改旧数据时,为了避免要同时失效派生出来的脏数据,可以在缓存中保存一些信息,当从缓存中读数据时可以利用这些信息判断数据是否已经失效。最常见的问题是保持他的进程的存活时间过长,或者在各种不同的用途下混合使用,而不是分别对不同类型的工作进行优化。

2024-01-01 16:52:53 465

原创 13、云端的Mysql

Mysql并不会在云端自动变得更具扩展性。事实上,如果机器的性能较差,会导致过早使用横向扩展策略。况且云托管服务相比专用的硬件可靠性和可预测性要更差写,所以想在云端获得高可用性需要更多的创新。在一些场景下云托管比传统的服务器部署方式更经济。云托管比较适合处于初级阶段的企业,或者那些持续接触新概念并且本质上是以适用为主的企业。由于较差的CPU、内存以及IO性能。在类似AWS这样的云托管平台上Mysql表现出来的性能并不如在其他地方好。Mysql需要四种基础资源来完成工作:CPU周期、内存、IO,以及网络。

2024-01-01 15:25:05 393

原创 12、高可用性

高可用性不是绝对的,只有相对更高的可用性。百分之百的可用性是不可能达到的。可用性的定义不仅仅包括服务正在运行的时间段,还包括应用是否能以足够好的性能处理请求。

2024-01-01 15:14:46 764

原创 11、可扩展的Mysql

另一种说法,可扩展性是当增加资源以处理负载和增加容量时系统能够获得的投资产出率。

2023-12-30 17:29:52 439

原创 10、复制

如果没有在 my.cnf 里定义服务器ID,可以通过 CHANGE MASTER TO来设置备库。但是却无法启动复制。必须为备库显示的设置服务器ID。

2023-12-30 14:51:51 1116

原创 9、操作系统和硬件优化

许多不同的硬件都会影响Mysql的性能,最常见的两个瓶颈是CPU和IO资源。当数据可以放在内存中或者可以从磁盘中以足够快的速度读取时,CPU可能出现瓶颈。IO瓶颈一般发生在所需要的数据远远超过有效内存容量的时候。如果应用程序是分布在网络上,或者如果有大量的查询和低延迟的要求,瓶颈可能转移到网络上,而不再是磁盘IO。

2023-12-24 20:25:32 414

原创 8、优化服务器设置

首先我们应该知道的是Mysql从哪里获取配置信息:命令行参数和配置文件。如果打算长期使用某些配置那么就应该写到全局配置文件,而不是在命令行指定。

2023-12-23 21:54:38 1000

原创 7、Mysql高级特性

分区表是一个独立的逻辑表,但是底层由多个物理子表组成。实现分区的代码实际上是对一组底层表的句柄对象的封装。对分区表的请求,都会通过句柄对象转化成对存储引擎的接口调用。Mysql实现分区表的方式是对底层表的封装,意味着索引也是按照分区的子表定义的,而没有全局索引。Mysql在创建表时使用 PARTITION BY 子句定义每个分区存放的数据,在执行查询的时候,优化器会根据分区定义过滤那些没有我们需要数据的分区,这样查询就无须扫描所有分区。分区的一个主要目的是将数据按照一个较粗的粒度分在不同的表中。

2023-12-17 21:33:43 126

原创 6、查询性能优化

在编写快速查询之前,需要清楚一点,真正重要的是响应时间。如果把查询看作是一个任务,那么他由一系列子任务组成,每个子任务都会消耗一定的时间。如果要优化查询,实际上要优化其子任务,要么消除其中一些子任务,要么减少子任务的执行次数,要么让子任务运行的更快。查询性能低下最基本的原因是访问的数据太多。某些查询不可避免地需要筛选大量数据,但这并不常见。大部分性能低下的查询都可以通过减少访问的数据量的方式进行优化。对于低效的查询,我们发现可以通过下面两个步骤来分析:有些查询会请求超过实际需要的数据,然后这些多余的数据会被

2023-12-16 20:27:29 573

原创 算法基础十五

给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。示例 1:输入:nums = [-10,-3,0,5,9] 输出:[0,-3,9,-10,null,5]解释:[0,-10,5,null,-3,null,9] 也将被视为正确答案:示例 2:输入:nums = [1,3] 输出:[3,1]

2023-12-16 11:12:50 395

原创 算法基础十四

给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。示例 1:输入:s = “Hello World” 输出:5 解释:最后一个单词是“World”,长度为5。示例 2:输入:s = " fly me to the moon " 输出:4 解释:最后一个单词是“moon”,长度为4。

2023-12-16 10:59:59 79

原创 算法基础十三

给你一个整数 n ,请你生成并返回所有由 n 个节点组成且节点值从 1 到 n 互不相同的不同 二叉搜索树。可以按 任意顺序 返回答案。示例 1:输入:n = 3输出:[[1,null,2,null,3],[1,null,3,2],[2,1,3],[3,1,null,null,2],[3,2,null,1]]示例 2:输入:n = 1 输出:[[1]]

2023-12-12 21:31:49 111

原创 算法基础十二

给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字。返回 已排序的链表。示例 1:输入:head = [1,2,3,3,4,4,5] 输出:[1,2,5]示例 2:输入:head = [1,1,1,2,3] 输出:[2,3]

2023-12-11 21:13:26 103

原创 算法基础十一

给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。示例 1:输入:n = 4, k = 2 输出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ]示例 2:输入:n = 1, k = 1 输出:[[1]]解题思路:DFS。

2023-12-10 20:19:26 169

原创 算法基础十

给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。示例 1:输入:digits = [1,2,3] 输出:[1,2,4] 解释:输入数组表示数字 123。示例 2:输入:digits = [4,3,2,1] 输出:[4,3,2,2] 解释:输入数组表示数字 4321。示例 3:输入:digits = [0]解题思路:给定数组代表一个十进制数,数组的0下标是十进制的高位。从数组尾部开始遍历,依次进位。

2023-12-10 19:45:39 125

原创 算法基础九

给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix。示例 1:输入:n = 3 输出:[[1,2,3],[8,9,4],[7,6,5]]示例 2:输入:n = 1 输出:[[1]]解题思路:里面元素是1 - n*n,并且数组是顺序螺旋排列。

2023-12-10 19:21:00 793

原创 5、创建高性能的索引

单行访问时很慢的。如果服务器从存储中读取一个数据块只是为了获取其中一行,那么就浪费了很多工作。最好读取的块中能包含尽可能多所需要的行。按顺序访问范围数据是很快的。第一,顺序IO不需要多次磁盘寻道,所以比随机IO要快很多;第二,如果服务器能够按需要顺序读取数据,那么就不再需要额外的排序操作,并且GROUP BY查询也无须再做排序和将行按组聚合计算了。索引覆盖查询是很快的,避免了回表查找。

2023-12-10 16:24:33 540

原创 算法基础八

实现 pow(x, n) ,即计算 x 的整数 n 次幂函数(即,xn )。示例 1:输入:x = 2.00000, n = 10 输出:1024.00000示例 2:输入:x = 2.10000, n = 3 输出:9.26100解题思路:用递归的方式,将n 二分下去,注意n的正负和奇偶。

2023-12-09 13:35:00 194

原创 算法基础七

给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。示例 1:输入:nums = [1,2,0] 输出:3示例 2:输入:nums = [3,4,-1,1] 输出:2示例 3:输入:nums = [7,8,9,11,12] 输出:1解题思路:为了减少复杂度,可以把数组缓存到map中,然后将 i 从1开始循环,一次对比map中是否存在 i 只要不存在就立即返回结果 i。

2023-12-09 12:44:35 194

空空如也

空空如也

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

TA关注的人

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