avatar
文章
78
标签
19
分类
12
首页
时间轴
标签
分类
留言板
关于
张晓风的博客
首页
时间轴
标签
分类
留言板
关于

张晓风的博客

day-7-行锁
发表于2024-07-23|MySQL学习笔记| 条评论
行锁就是针对数据表中行记录的锁。 一、两阶段锁在 InnoDB 事务中,行锁是在需要的时候才加上的,但并不是不需要了就立刻释放,而是要等到事务结束时才释放。这个就是两阶段锁协议。 如果你的事务中需要锁多个行,要把最可能造成锁冲突、最可能影响并发度的锁尽量往后放。 二、死锁和死锁检测当并发系统中不同线程出现循环资源依赖,涉及的线程都在等待别的线程释放资源时,就会导致这几个线程都进入无限等待的状态,称为死锁。 当出现死锁以后,有两种策略: 一种策略是,直接进入等待,直到超时。 另一种策略是,发起死锁检测,发现死锁后,主动回滚死锁链条中的某一个事务,让其他事务得以继续执行。 三、小结如果你的事务中需要锁多个行,要把最可能造成锁冲突、最可能影响并发度的锁的申请时机尽量往后放。
day-6-全局锁和表锁
发表于2024-07-21|MySQL学习笔记| 条评论
数据库锁设计的初衷是处理并发问题。作为多用户共享的资源,当出现并发访问的时候,数据库需要合理地控制资源的访问规则。而锁就是用来实现这些访问规则的重要数据结构。 一、全局锁全局锁就是对整个数据库实例加锁。 全局锁的典型使用场景是,做全库逻辑备份。 业务的更新不只是增删改数据(DML),还有可能是加字段等修改表结构的操作(DDL)。 二、表级锁MySQL 里面表级别的锁有两种:一种是表锁,一种是元数据锁(meta data lock,MDL)。 表锁的语法是 lock tables … read/write。 在还没有出现更细粒度的锁的时候,表锁是最常用的处理并发的方式。而对于 InnoDB 这种支持行锁的引擎,一般不使用 lock tables 命令来控制并发,毕竟锁住整个表的影响面还是太大。 三、小结全局锁主要用在逻辑备份过程中。对于全部是 InnoDB 引擎的库,建议选择使用–single-transaction 参数,对应用会更友好。 表锁一般是在数据库引擎不支持行锁的时候才会被用到的。如果你发现你的应用程序里有 lock tables 这样的语句,你需要追查一...
day-11-线性排序
发表于2024-07-21|数据结构与算法学习笔记| 条评论
一、桶排序核心思想是将要排序的数据分到几个有序的桶里,每个桶里的数据再单独进行排序。桶内排完序之后,再把每个桶里的数据按照顺序依次取出,组成的序列就是有序的了。 桶排序比较适合用在外部排序中。 二、计数排序计数排序只能用在数据范围不大的场景中,如果数据范围 k 比要排序的数据 n 大很多,就不适合用计数排序了。而且,计数排序只能给非负整数排序,如果要排序的数据是其他类型的,要将其在不改变相对大小的情况下,转化为非负整数。 三、基数排序基数排序对要排序的数据是有要求的,需要可以分割出独立的“位”来比较,而且位之间有递进的关系,如果 a 数据的高位比 b 数据大,那剩下的低位就不用比较了。除此之外,每一位的数据范围不能太大,要可以用线性排序算法来排序,否则,基数排序的时间复杂度就无法做到 O(n) 了。 四、小结桶排序和计数排序的排序思想是非常相似的,都是针对范围不大的数据,将数据划分成不同的桶来实现排序。基数排序要求数据可以划分成高低位,位之间有递进关系。比较两个数,我们只需要比较高位,高位相同的再比较低位。而且每一位的数据范围不能太大,因为基数排序算法需要借助桶排序或者计数排序来...
day-5-索引(下)
发表于2024-07-20|MySQL学习笔记| 条评论
一、覆盖索引回表:回到主键索引树搜索的过程。覆盖索引:在查询里面,如果某个索引覆盖了我们的查询需求,我们称这个索引为覆盖索引。 由于覆盖索引可以减少树的搜索次数,显著提升查询性能,所以使用覆盖索引是一个常用的性能优化手段。 二、最左前缀原则B+ 树这种索引结构,可以利用索引的“最左前缀”,来定位记录。 最左前缀可以是联合索引的最左 N 个字段,也可以是字符串索引的最左 M 个字符。 在建立联合索引的时候,如何安排索引内的字段顺序?第一原则是,如果通过调整顺序,可以少维护一个索引,那么这个顺序往往就是需要优先考虑采用的。 三、索引下推MySQL 5.6 引入的索引下推优化(index condition pushdown), 可以在索引遍历过程中,对索引中包含的字段先做判断,直接过滤掉不满足条件的记录,减少回表次数。
day-4-索引(上)
发表于2024-07-19|MySQL学习笔记| 条评论
一、索引的常见模型1.1 哈希表哈希表是一种以键 - 值(key-value)存储数据的结构,我们只要输入待查找的键即 key,就可以找到其对应的值即 Value。哈希的思路很简单,把值放在数组里,用一个哈希函数把 key 换算成一个确定的位置,然后把 value 放在数组的这个位置。 哈希表这种结构适用于只有等值查询的场景,比如 Memcached 及其他一些 NoSQL 引擎。 1.2 有序数组有序数组在等值查询和范围查询场景中的性能就都非常优秀。如果仅仅看查询效率,有序数组就是最好的数据结构了。但是,在需要更新数据的时候就麻烦了,你往中间插入一个记录就必须得挪动后面所有的记录,成本太高。 有序数组索引只适用于静态存储引擎。 1.3 二叉搜索树二叉搜索树的特点是:父节点左子树所有结点的值小于父节点的值,右子树所有结点的值大于父节点的值。 二、InnoDB 的索引模型在 InnoDB 中,表都是根据主键顺序以索引的形式存放的,这种存储方式的表称为索引组织表。又InnoDB 使用了 B+ 树索引模型,所以数据都是存储在 B+ 树中的。 每一个索引在 InnoDB 里面对应一棵 B...
day-3-事务隔离
发表于2024-07-18|MySQL学习笔记| 条评论
一、隔离性与隔离级别事务的四大特性:原子性、一致性、隔离性、持久性。 SQL 标准的事务隔离级别包括:读未提交(read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(serializable )。 读未提交:一个事务还没提交时,它做的变更就能被别的事务看到。 读已提交:一个事务提交之后,它做的变更才会被其他事务看到。 可重复读:一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的。 串行化:对于同一行记录,“写”会加“写锁”,“读”会加“读锁”。当出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行。 二、事务隔离的实现长事务意味着系统里面会存在很老的事务视图。由于这些事务随时可能访问数据库里面的任何数据,所以这个事务提交之前,数据库里面它可能用到的回滚记录都必须保留,这就会导致大量占用存储空间。 事务的启动方式: 1.显式启动事务语句, begin 或 start transaction。配套的提交语句是 commit,回滚语句是 rollback。 2.set ...
day-2-日志系统
发表于2024-07-17|MySQL学习笔记| 条评论
一、重做日志:redo log当有一条记录需要更新的时候,InnoDB 引擎就会先把记录写到 redo log 里面,并更新内存,这个时候更新就算完成了。同时,InnoDB 引擎会在适当的时候,将这个操作记录更新到磁盘里面,而这个更新往往是在系统比较空闲的时候做。 有了 redo log,InnoDB 就可以保证即使数据库发生异常重启,之前提交的记录都不会丢失,这个能力称为 crash-safe。 二、归档日志:bin logredo log 是 InnoDB 引擎特有的日志,而 Server 层也有自己的日志,称为 binlog(归档日志)。 MySQL 自带的引擎是 MyISAM,但是 MyISAM 没有 crash-safe 的能力,binlog 日志只能用于归档。而 InnoDB 是另一个公司以插件形式引入 MySQL 的,既然只依靠 binlog 是没有 crash-safe 能力的,所以 InnoDB 使用另外一套日志系统——也就是 redo log 来实现 crash-safe 能力。 三、两种日志的不同点 redo log 是 InnoDB 引擎特有的;binlo...
day-1-MySQL的基础架构
发表于2024-07-16|MySQL学习笔记| 条评论
一、 MySQL的基础架构 Server层:连接器、查询缓存、分析器、优化器、执行器等核心服务功能,以及所有的内置函数和跨存储引擎的功能(存储过程、触发器、视图等)。 存储引擎层:负责数据的存储和提取。 二、连接器连接器负责跟客户端建立连接、获取权限、维持和管理连接。 数据库里面,长连接是指连接成功后,如果客户端持续有请求,则一直使用同一个连接。短连接则是指每次执行完很少的几次查询就断开连接,下次查询再重新建立一个。 三、查询缓存MySQL 拿到一个查询请求后,会先到查询缓存看看,之前是不是执行过这条语句。之前执行过的语句及其结果可能会以 key-value 对的形式,被直接缓存在内存中。 MySQL 8.0 版本直接将查询缓存的整块功能删掉了,也就是说 8.0 开始彻底没有这个功能了。 四、分析器如果没有命中查询缓存,就要开始真正执行语句了。 分析器先会做“词法分析”。你输入的是由多个字符串和空格组成的一条 SQL 语句,MySQL 需要识别出里面的字符串分别是什么,代表什么。 五、优化器优化器是在表里面有多个索引的时候,决定使用哪个索引;或者在一个语句有多表关联(join...
如何在Redis中保存时间序列数据
发表于2024-07-10|Redis学习笔记| 条评论
一、时间序列数据的读写特点时间序列数据通常是持续高并发写入的。时间序列数据的写入特点很简单,就是插入数据快,这就要求我们选择的数据类型,在进行数据插入时,复杂度要低,尽量不要阻塞。 时间序列数据读的特点:查询模式多。即要支持单点查询、范围查询和聚合计算。 Redis提供了保存时间序列数据的两种方案,分别可以基于 Hash 和 Sorted Set实现,以及基于 RedisTimeSeries 模块实现。 二、基于 Hash 和 Sorted Set 保存时间序列数据2.1 为什么保存时间序列数据,要同时使用这两种类型?Hash 类型的特点:可以实现对单键的快速查询,这满足时间序列数据的单键查询需求。但 Hash 类型有个短板:它并不支持对数据进行范围查询。 Sorted Set 支持按时间戳范围查询,因为它能够根据元素的权重分数来排序。 2.1 如何保证写入 Hash 和 Sorted Set 是一个原子性的操作?Redis 用来实现简单事务的命令:MUTIL 命令和 EXEC 命令。 MUTIL 命令:表示一系列原子性操作的开始。收到这个命令后,Redis 就知道,接下来再收...
day-10-排序(下)
发表于2024-07-10|数据结构与算法学习笔记| 条评论
一、归并排序的原理归并排序的核心思想:如果要排序一个数组,先把数组从中间分成前后两部分,然后对前后两部分分别排序,再将排好序的两部分合并在一起,这样整个数组就都有序了。 归并排序使用的就是分治思想。分治,顾名思义,就是分而治之,将一个大问题分解成小的子问题来解决。小的子问题解决了,大问题也就解决了。 分治是一种解决问题的处理思想,递归是一种编程技巧 二、快速排序的原理快排的思想是这样的:如果要排序数组中下标从 p 到 r 之间的一组数据,我们选择 p 到 r 之间的任意一个数据作为 pivot(分区点)。 我们遍历 p 到 r 之间的数据,将小于 pivot 的放到左边,将大于 pivot 的放到右边,将 pivot 放到中间。经过这一步骤之后,数组 p 到 r 之间的数据就被分成了三个部分,前面 p 到 q-1 之间都是小于 pivot 的,中间是 pivot,后面的 q+1 到 r 之间是大于 pivot 的。 三、快排和归并的区别归并排序的处理过程是由下到上的,先处理子问题,然后再合并。而快排正好相反,它的处理过程是由上到下的,先分区,然后再处理子问题。 四、小结归并排序...
1…345…8
avatar
张晓风
文章
78
标签
19
分类
12
Follow Me
最新文章
使用zlmediakit录像2025-06-26
DTM事务学习笔记2025-04-23
计算机网络-第一章笔记2025-03-02
单线复用--家里宽带2025-03-01
计算机网络 - B站学习计划2025-02-12
分类
  • MySQL学习笔记14
  • Redis学习笔记3
  • java3
  • nginx4
  • spring13
  • 工具6
  • 建站相关2
  • 开发相关8
标签
数据结构与算法 websocket nginx spring jira network 软考 docker linux 面试 ldap logback MySQL redis postman git java springboot hexo
归档
  • 六月 2025 1
  • 四月 2025 1
  • 三月 2025 2
  • 二月 2025 1
  • 一月 2025 4
  • 十一月 2024 1
  • 十月 2024 1
  • 九月 2024 5
网站信息
文章数目 :
78
本站总字数 :
53.6k
本站访客数 :
本站总浏览量 :
最后更新时间 :
©2024 - 2025 By 张晓风
苏ICP备2023046043号