摘要: SQL优化一般步骤 慢日志定位 通过慢查日志等定位那些执行效率较低的SQL语句 MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中。long_query_time的 阅读全文
posted @ 2026-03-27 09:00 程序员Seven 阅读(222) 评论(0) 推荐(1)
摘要: 开篇结论 加锁的对象是索引,加锁的基本单位是 next-key lock,它是由记录锁和间隙锁组合而成的,next-key lock 是左开右闭区间,而间隙锁是左开右开区间。 在只使用记录锁或者间隙锁就能避免幻读现象的场景下, next-key lock 就会退化成记录锁或间隙锁。 假设这个表,id 阅读全文
posted @ 2026-03-26 09:00 程序员Seven 阅读(173) 评论(2) 推荐(1)
摘要: 全局锁 flush tables with read lock 执行后,整个数据库就处于只读状态了,这时其他线程执行以下操作,都会被阻塞: 对数据的增删改操作,比如 insert、delete、update等语句; 对表结构的更改操作,比如 alter table、drop table 等语句。 全 阅读全文
posted @ 2026-03-25 09:00 程序员Seven 阅读(162) 评论(0) 推荐(0)
摘要: 索引的作用 说白了索引就是数据的目录,根据索引去查数据必然比在库中一行记录一行记录的查更快 索引分类 按数据结构分类 Mysql的数据是存储在磁盘中的,每次从磁盘中读取数据都需要进行一次IO。一个表的数据在磁盘上由于插入顺序的原因肯定不是顺序存放,如果按照表字段内容顺序查找,如果一个500万条数据的 阅读全文
posted @ 2026-03-24 09:00 程序员Seven 阅读(165) 评论(0) 推荐(0)
摘要: 逻辑存储结构 表空间由段(segment)、区(extent)、页(page)、行(row)组成,InnoDB存储引擎的逻辑存储结构大致如下图: 行(row) 数据库表中的记录都是按行(row)进行存放的,每行记录根据不同的行格式,有不同的存储结构。 页(page) 记录是按照行来存储的,但是数据库 阅读全文
posted @ 2026-03-23 09:00 程序员Seven 阅读(184) 评论(1) 推荐(1)
摘要: 执行流程图 MySQL 的架构可以大致划分为四个层次:连接层、服务层、存储引擎层和文件系统层。 连接层:负责对来自客户端的连接进行权限验证,并将连接信息存入连接池中,方便后续的连接复用。 服务层:主要负责 SQL 语句的解析与优化,还包括查询缓存和 MySQL 内置函数的实现。 存储引擎层:提供多种 阅读全文
posted @ 2026-03-20 09:00 程序员Seven 阅读(226) 评论(0) 推荐(1)
摘要: Thread Dump介绍 什么是Thread Dump Thread Dump是非常有用的诊断Java应用问题的工具。每一个Java虚拟机都有及时生成所有线程在某一点状态的thread-dump的能力,虽然各个 Java虚拟机打印的thread dump略有不同,但是 大多都提供了当前活动线程的快 阅读全文
posted @ 2026-03-18 09:00 程序员Seven 阅读(199) 评论(0) 推荐(1)
摘要: Java 调试入门工具 jps jps是jdk提供的一个查看当前java进程的小工具, 可以看做是JavaVirtual Machine Process Status Tool的缩写。 jps常用命令 jps # 显示进程的ID 和 类的名称 jps –l # 输出输出完全的包名,应用主类名,jar 阅读全文
posted @ 2026-03-17 09:00 程序员Seven 阅读(189) 评论(0) 推荐(2)
摘要: Java对象结构 实例化一个Java对象之后,该对象在内存中的结构是怎么样的?Java对象(Object实例)结构包括三部分:对象头、对象体和对齐字节,具体下图所示 Java对象的三部分 对象头 对象头包括三个字段,第一个字段叫作Mark Word(标记字),用于存储自身运行时的数据,例如GC标志位 阅读全文
posted @ 2026-03-16 09:00 程序员Seven 阅读(156) 评论(0) 推荐(1)
摘要: 概述 计算机是不能直接运行java代码的,必须要先运行java虚拟机,再由java虚拟机运行编译后的java代码。 因为在cpu层面看来计算机中所有的操作都是一个个指令的运行汇集而成的,java是高级语言,只有人类才能理解其逻辑,计算机是无法识别的,所以java代码必须要先编译成字节码文件,jvm才 阅读全文
posted @ 2026-03-13 09:00 程序员Seven 阅读(221) 评论(0) 推荐(0)
摘要: 引言 我朋友,一个脾气温和、情绪稳定的成年人,今天,在电脑前憋出了他今年第一句字正腔圆的国骂。 对象不是甲方,不是队友,而是一个AI——确切说,是一个花了他不少钱、号称能当“私人数字助理”的玩意儿,花名龙虾。 事情得从头说起。那天下午,他喜气洋洋地跟我显摆,说也养了个龙虾,能自动整理AI资讯,能给它 阅读全文
posted @ 2026-03-12 22:37 程序员Seven 阅读(72) 评论(0) 推荐(0)
摘要: Java NIO零拷贝 在 Java NIO 中的通道(Channel)就相当于操作系统的内核空间(kernel space)的缓冲区,而缓冲区(Buffer)对应的相当于操作系统的用户空间(user space)中的用户缓冲区(user buffer)。 通道(Channel)是全双工的(双向传输 阅读全文
posted @ 2026-03-11 09:00 程序员Seven 阅读(186) 评论(0) 推荐(0)
摘要: 流与块 Standard IO是对字节流的读写,在进行IO之前,首先创建一个流对象,流对象进行读写操作都是按字节 ,一个字节一个字节的来读或写。而NIO把IO抽象成块,类似磁盘的读写,每次IO操作的单位都是一个块,块被读入内存之后就是一个byte[],NIO一次可以读或写多个字节。 I/O 与 NI 阅读全文
posted @ 2026-03-09 09:00 程序员Seven 阅读(237) 评论(0) 推荐(1)
摘要: 题⽬描述 给定⼀个⼆叉搜索树, 找到该树中两个指定节点的最近公共祖先。 对于该题的最近的公共祖先定义:对于有根树T的两个结点p 、q ,最近公共祖先LCA(T,p,q)表示⼀个结点x ,满⾜x 是p 和q 的祖先且x 的深度尽可能⼤。在这⾥,⼀个节点也可以是它⾃⼰的祖先. ⼆叉搜索树是若它的左⼦树不 阅读全文
posted @ 2026-03-07 09:59 程序员Seven 阅读(39) 评论(0) 推荐(0)
摘要: 关于同步/异步,阻塞/非阻塞,Unix IO模型,可以先看这篇文章网络系统 - Unix IO模型 BIO概述 阻塞式IO。也就是说io没有就绪的时候,操作IO当前线程会被阻塞。也就是用户线程需要等待IO线程完成 服务器实现模式为一个连接一个线程,也就是说,客户端每当有一个连接请求的时候,服务器就需 阅读全文
posted @ 2026-03-05 09:00 程序员Seven 阅读(144) 评论(0) 推荐(0)
摘要: 题⽬描述 给定⼀个⼆叉树root和⼀个整数值 sum ,求该树有多少路径的的节点值之和等于 sum 。 该题路径定义不需要从根节点开始,也不需要在叶⼦节点结束,但是⼀定是从⽗亲节点往下到孩⼦节点 总节点数⽬为 n 保证最后返回的路径个数在整形范围内 假如⼆叉树 root 为 {1,2,3,4,5,4 阅读全文
posted @ 2026-03-04 09:00 程序员Seven 阅读(35) 评论(0) 推荐(0)
摘要: 题目描述 请从字符串中找出⼀个最⻓的不包含重复字符的⼦字符串,计算该最⻓⼦字符串的⻓度。 数据范围: ⻓度⼩于40000 示例1 输⼊:"abcabcbb" 返回值:3 说明:因为⽆重复字符的最⻓⼦串是"abc",所以其⻓度为 3。 示例2 输⼊:"bbbbb" 返回值:1 说明:因为⽆重复字符的最 阅读全文
posted @ 2026-03-03 09:00 程序员Seven 阅读(34) 评论(0) 推荐(0)
摘要: 这是Java19新增的预览版功能,到Java21正式可以使用 简介 虚拟线程是一种用户态下的线程,类似go语言中的goroutines 和Erlang中的processes,虚拟线程并非比线程快,而是提高了应用的吞吐量,相比于传统的线程是由操作系统调度来看,虚拟线程是我们自己程序调度的线程。如果你对 阅读全文
posted @ 2026-03-02 09:00 程序员Seven 阅读(235) 评论(0) 推荐(1)
摘要: 概述 Condition 是一个多线程协调通信的工具类,可以让某些线程一起等待某个条件(condition),只有满足条件时,线程才会被唤醒。 在使用Lock之前,使用的最多的同步方式应该是synchronized关键字来实现同步方式了。配合Object的wait()、notify()系列方法可以实 阅读全文
posted @ 2026-02-27 09:00 程序员Seven 阅读(206) 评论(0) 推荐(0)
摘要: 题⽬描述 给定⼀个⾮负整数 x ,计算并返回 x 的平⽅根,即实现 int sqrt(int x) 函数。 正数的平⽅根有两个,只输出其中的正数平⽅根。如果平⽅根不是整数,输出只保留整数的部分,⼩数部分将被舍去。 示例1 输⼊:8 返回值:2 解释:8 的平⽅根是 2.82842…,由于⼩数部分将被 阅读全文
posted @ 2026-02-26 09:00 程序员Seven 阅读(41) 评论(0) 推荐(0)