- 博客(70)
- 收藏
- 关注
原创 MySQL进阶-排序优化&分组优化
在MySQL中,支持两种排序方式,分别是FileSort和Index排序。Index 排序中,索引可以保证数据的有序性,不需要再进行排序,效率更高。FileSort 排序则一般在内存中进行排序,占用CPU较多。如果待排结果较大,会产生临时文件 I/O 到磁盘进行排序的情况,效率较低。SQL 中,可以在 WHERE 子句和 ORDER BY 子句中使用索引,避免全表扫描,在 ORDER BY 子句。当然,某些情况下全表扫描,或者 FileSort 排序不一定比索引慢。但总的来说,尽量使用。
2025-03-14 15:19:32
900
原创 MySQL进阶-优化查询
简单说就是,索引列+主键包含SELECT 到 FROM之间查询的列。理解方式一:索引是高效找到行的一个方法,但是一般数据库也能使用索引找到一个列的数据,因此它不必读取整个行。毕竟索引叶子节点存储了它们索引的数据;当能通过读取索引就可以得到想要的数据,那就不需要读取行了。一个索引包含了满足查询结果的数据就叫做覆盖索引。理解方式二:非聚簇复合索引的一种形式,它包括在查询里的SELECT、JOIN和WHERE子句用到的所有列 (即建索引的字段正好是覆盖查询条件中所涉及的字段)。
2025-03-12 12:19:39
637
原创 MySQL进阶-关联查询优化
下面开始 EXPLAIN 分析结论:type 有All ,代表着全表扫描,效率较差添加索引优化可以看到第二行的 type 变为了 ref,rows 也变成了优化比较明显。,左边一定都有,所以。。只是对左边的表建立索引的话,是没有效果的,可以通过rows这一列看到,type表要读取的记录仍然是20条。把右边的表的索引删除,可以发现现在又要走全表扫描了。
2025-03-08 12:55:27
1218
原创 MySQL进阶-分析查询语句EXPLAIN
下边我们看一个连接查询的执行计划,可以看出这个连接查询的执行计划中有两条记录,这两条记录的table列分别是s1和s2,这两条记录用来分别说明对s1表和s2表的访问方法是什么。不论我们的查询语句有多复杂,里边儿 包含了多少个表 ,到最后也是需要对每个表进行 单表访问 的,所 以MySQL规定EXPLAIN语句输出的每条记录都对应着某个单表的访问方法,该条记录的table列代表着该 表的表名(有时不是真实的表名字,可能是简称)。我们看一下执行计划中是怎么体现MySQL使用索引合并的方式来对某个表执行查询的。
2025-03-07 15:18:39
1097
原创 MySQL进阶-索引设计原则
冗余索引通过 idx_name_birthday_phone_number 索引就可以对 name 列进行快速搜索,再创建一 个专门针对 name 列的索引就算是一个 冗余索引 ,维护这个索引只会增加维护的成本,并不会对搜索有 什么好处。重复索引另一种情况,我们可能会对某个列 重复建立索引 ,比方说这样,col2 INT,我们看到,col1 既是主键、又给它定义为一个唯一索引,还给它定义了一个普通索引,可是主键本身就 会生成聚簇索引,所以定义的唯一索引和普通索引是重复的,这种情况要避免。
2025-03-03 15:09:26
592
原创 MySQL进阶-锁分类
读锁:也称为共享锁、英文用 S 表示。针对同一份数据,。写锁:也称为排他锁、英文用 X 表示。当前写操作没有完成前,它会阻断其他写锁和读锁。这样就能确保在给定的时间里,只有一个事务能执行写入,当当前事务在读取记录时加上S锁,就允许其它事务也获取读锁,但要获取写锁,则必须等到所有事务都释放读锁为止,如果加了写锁,其它事务想要获取读锁或写锁,来读取记录或修改记录,都会阻塞。这就避免了脏读和不可重复读。mysql5.7之前,如果阻塞等待就会一直等待,mysql8.0之后加上了超时时间。
2025-02-23 16:19:59
647
原创 Mysql进阶-锁初始
在数据库中,除传统的计算资源(如CPU、RAM、I/O等)的争用以外,数据也是一种供许多用户共享的 资源。为保证数据的一致性,并发操作进行控制,因此产生了锁。同时锁机制也为实现MySQL 的各个隔离级别提供了保证。锁冲突也是影响数据库并发访问性能的一个重要因素。所以锁对数据库而言显得尤其重要,也更加复杂。
2025-02-19 21:28:38
702
原创 Mysql-事务日志undo log
事务需要保证原子性,也就是事务中的操作要么全部完成,要么什么也不做。但有时候事务执行到一半会出现一些情况,比如:情况一:事务执行过程中可能遇到各种错误,比如服务器本身的错误操作系统错误,甚至是突然断电导致的错误。情况二:程序员可以在事务执行过程中手动输入ROLLBACK语句结束当前事务的执行。以上情况出现,我们需要把数据改回原先的样子,这个过程称之为回滚,这样就可以造成一个假象:这个事务看起来什么都没做,所以符合原子性要求。
2025-02-18 21:44:57
1044
1
原创 Mysql-事务日志 redo日志
事务有4种特性:原子性、一致性、隔离性和持久性。那么事务的四种特性到底是基于什么机制实现呢?事务的隔离性由锁机制实现。而事务的原子性、一致性和持久性由事务的 redo 日志和undo 日志来保证。REDO LOG 称为重做日志,提供再写入操作,恢复提交事务修改的页操作,用来保证事务的持久性。UNDO LOG 称为回滚日志,回滚行记录到某个特定版本,用来保证事务的原子性、一致性。有的DBA或许会认为 UNDO 是 REDO 的逆过程,其实不然。
2025-02-15 15:45:44
1082
原创 MySQL-InnoDB数据存储结构
每个页之间在内存上并不相联,只是通过维护双向链表进行逻辑相联,数据页中数据会按照主键值大小排序,组成一个单向链表。
2024-12-29 15:04:36
809
原创 Mysql-索引的数据结构
MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。索引的本质:索引是数据结构。你可以简单理解为“排好序的快速查找数据结构”,满足特定查找算法。这些数据结构以某种方式指向数据, 这样就可以在这些数据结构的基础上实现高级查找算法。索引是在存储引擎中实现的,因此每种存储引擎的索引不一定完全相同,并且每种存储引擎不一定支持所有索引类型。同时,存储引擎可以定义每个表的最大索引数和最大索引长度。所有存储引擎支持每个表至少16个索引,总索引长度至少为256字节。
2024-12-22 15:55:20
864
原创 Mysql-数据库缓冲池(Buffer pool)
InnoDB存储引擎是以页为单位来管理存储空间的,我们进行的增删改查操作其实本质上都是在访问页面(包括读页面、写页面、创建新页面等操作)。,为了能让数据表或者索引中的数据随时被我们所用,DBMS 会申请,在真正访问页面之前,需要把在磁盘上的页缓存到内存中的 Buffer Pool 之后才可以访问。这样做的好处是,从而 减少与磁盘直接进行 I/O 的时间。要知道,这种策略对提升。如果索引的数据在缓冲池里,那么访问的成本就会降低很多。
2024-12-21 15:06:41
844
原创 MySQL-逻辑架构篇
简化为三层结构:连接层:客户端和服务器端建立连接,客户端发送 SQL至服务器端;SQL 层(服务层):对 SQL 语句进行查询处理;与数据库文件的存储方式无关;存储引擎层:与数据库文件打交道,负责数据的存储和读取。
2024-12-14 14:12:05
1090
原创 Redis原理篇-Redis数据结构(下)
SkipList(跳表)首先是链表,但与传统链表相比有几点差异: 元素按照升序排列存储 节点可能包含多个指针,指针跨度不同。有多级指针,指针的跨度不同,同时又是双向链表,可以方便得向前向后查询,类似于索引b+树, 通过指针再找到对应的数据。
2024-11-07 20:27:25
593
原创 Redis原理篇-Redis数据结构(上)
Dict的结构:类似java的HashTable,底层是数组加链表来解决哈希冲突Dict包含两个哈希表,ht[0]平常用,ht[1]用来rehashDict的伸缩:当LoadFactor大于5或者LoadFactor大于1并且没有子进程任务时,Dict扩容当LoadFactor小于0.1时,Dict收缩扩容大小为第一个大于等于used + 1的2^n收缩大小为第一个大于等于used 的2^nDict采用渐进式rehash,每次访问Dict时执行一次rehash。
2024-10-29 20:10:07
1036
原创 JUC-ReentrantLock 原理
简而言之,公平与非公平的区别在于,公平锁中的tryAcquire方法被重写了,新来的线程即便得知了锁的state为0,也要先判断等待队列中是否还有线程等待,只有当队列没有线程等待式,才获得锁。jdk11之后是直接进入 tryAcquire 逻辑,使用cas将state尝试改成1,这时 state 已经是1,结果仍然失败,cas操作返回false,进入下一个逻辑。获取当前node的前驱节点,如果前驱节点是头结点,则再执行一次CAS获取锁,获取失败则调用park,进入等待队列中等待。
2024-10-26 13:35:52
889
原创 JUC-AQS原理
AQS,全称是 AbstractQueuedSynchronizer,中文意思是抽象队列同步器,由 Doug Lea 设计,是 Java 并发包的核心框架类,许多同步类的实现都依赖于它,如 ReentrantLock、Semaphore、CountDownLatch 等。
2024-10-20 16:04:29
766
原创 JUC-线程池
说明:ScheduledThreadPoolExecutor是带调度的线程池ThreadPoolExecutor是不带调度的线程池。
2024-10-20 15:07:47
808
原创 Redis-分片集群
主从和哨兵可以解决高可用、高并发读的问题。但是依然有两个问题没有解决:海量数据存储问题高并发写的问题使用分片集群可以解决上述问题,如图:分片集群特征:集群中有多个master,每个master保存不同数据每个master都可以有多个slave节点master之间通过ping监测彼此健康状态客户端请求可以访问集群任意节点,最终都会被转发到正确节点。
2024-09-19 20:06:12
720
原创 Redis-哨兵集群
哨兵的结构如图::Sentinel 会不断检查您的master和slave是否按预期工作:如果master故障,Sentinel会将一个slave提升为master。当故障实例恢复后也以新的master为主:Sentinel充当Redis客户端的服务发现来源,当集群发生故障转移时,会将最新信息推送给Redis的客户端。
2024-09-08 15:45:50
959
1
原创 Redis-主从集群
因为slave原本也是一个master,有自己的replid和offset,(宕机重启后)当第一次变成slave,与master建立连接时,发送的replid和offset是自己的replid和offset。如果slave的offset小于master的offset,说明slave数据落后于master,需要更新。如果master继续写入新数据,其offset就会覆盖旧的数据,直到将slave现在的offset也覆盖,注意此时master已经覆盖了从节点尚未同步过去的数据,这就出现了主从之间数据的不一致。
2024-09-07 19:36:01
1521
原创 JUC-无锁之CAS
原有实现并不是线程安全的方法对应的字节码多线程执行原因:Integer虽然是不可变类,,但是以上操作涉及到了,等价于以下代码:前一个方法(valueOf)的结果决定后一个方法(构造方法),这种组合在多线程环境下线程不安全。
2024-09-04 20:51:55
1131
原创 JUC-指令有序性
JVM 会在不影响正确性的前提下,可以调整语句的执行顺序,思考下面一段代码可以看到,至于是先执行 i 还是 先执行 j ,对最终的结果不会产生影响。所以,上面代码真正执行时,既可以是也可以是这种特性称之为『指令重排』,多线程下『指令重排』会影响正确性。为什么要有重排指令这项优化呢?从 CPU 执行指令的原理来理解一下吧。
2024-09-01 13:13:53
818
原创 JUC-JAVA内存模型
Balking (犹豫)模式用在一个线程发现另一个线程或本线程已经做了某一件相同的事,那么本线程就无需再做 了,直接结束返回。
2024-08-31 13:56:25
848
原创 JUC-多把锁&线程活跃性
一间大屋子有两个功能:睡觉、学习,互不相干。现在小南要学习,小女要睡觉,但如果只用一间屋子(一个对象锁)的话,那么并发度很低解决方法是准备多个房间(多个对象锁)锁的粒度太大,多线程就会变成串行执行了。12:13:54.471 [小南] c.BigRoom - study 1 小时12:13:55.476 [小女] c.BigRoom - sleeping 2 小时根据业务的不同,进行锁的粒度缩小,可以保证多线程下能并发执行,而不是一直串行执行。
2024-08-28 21:19:33
416
原创 JVM-垃圾回收篇
Java8 时,堆被分为了两份:新生代和老年代(1:2),在 Java7 时,还存在一个永久代新生代使用:复制算法老年代使用:标记 - 清除 或者 标记 - 整理 算法Minor GC 和 Full GC。
2024-08-24 15:12:47
1006
原创 JUC- wait / notify原理
Owner 线程发现条件不满足,调用 wait 方法,BLOCKED 和 WAITING 的线程都处于,不占用 CPU 时间片BLOCKED 线程会在WAITING 线程会在 Owner 线程调用 notify 或 notifyAll 时唤醒,但唤醒后并不意味者立刻获得锁,仍需obj.wait()让进入 object 监视器的线程到 waitSet 等待wait()方法会释放对象的锁,进入 WaitSet 等待区,从而让其他线程就机会获取对象的锁。, 到 n 毫秒后结束等待,或是被 notify。
2024-08-24 13:44:24
825
原创 JUC-Synchronized原理进阶
轻量级锁的使用场景:如果一个对象虽然有多线程要加锁,但加锁的时间是错开的(也就是没有竞争),那么可以使用轻量级锁来优化。轻量级锁对使用者是透明的,即语法仍然是 synchronized假设有两个方法同步块,利用同一个对象加锁创建锁记录(Lock Record)对象,每个线程都的栈帧都会包含一个锁记录的结构,内部可以存储锁定对象的 Mark Word。
2024-08-23 21:16:38
1112
原创 JVM-Java的四种引用
无论是通过引用计数算法判断对象的引用数量,还是通过可达性分析算法判断对象是否可达,判定对象是否可被回收都与引用有关,Java 提供了四种强度不同的引用类型。
2024-08-21 21:45:33
602
原创 JUC- Synchronized原理
每个 Java 对象都可以关联一个 Monitor 对象,如果使用 synchronized 给对象上锁(重量级)之后,该对象头的 Mark Word 中就被设置指向 Monitor 对象的指针。在 Thread-2 上锁的过程中,如果 Thread-3,Thread-4,Thread-5 也来执行 synchronized(obj),就会进入 EntryList BLOCKED。其中 Mark Word 结构为,以Normal状态为例,会存储对象的hashcode和永久代年龄,是否是偏向锁,加锁状态。
2024-08-20 20:09:38
698
原创 JVM-内存结构
内存结构是 JVM 中非常重要的一部分,是非常重要的系统资源,是硬盘和 CPU 的桥梁,承载着操作系统和应用程序的实时运行,又叫运行时数据区JVM 内存结构规定了 Java 在运行过程中内存申请、分配、管理的策略,保证了 JVM 的高效稳定运行Java1.8 以前的内存结构图:线程运行诊断:常见 OOM 错误:Java 虚拟机栈:Java Virtual Machine Stacks,每个线程运行时所需要的内存设置栈内存大小: 在 JDK 1.4 中默认为 256K,而在 JDK 1.5+ 默认为 1M局部
2024-08-15 21:18:00
1088
原创 JUC-变量的线程安全
如果它们没有共享,则线程安全,。如果它们被共享了,根据它们的状态是否能够改变,又分两种情况如果只有读操作,则线程安全如果有读写操作,则这段代码是临界区,需要考虑线程安全局部变量是线程安全的但局部变量引用的对象则未必如果该对象没有逃离方法的作用访问,它是线程安全的如果该对象逃离方法的作用范围,需要考虑线程安全int i = 10;i++;每个线程调用 test1() 方法时局部变量 i,会在每个线程的栈帧内存中被创建多份,因此不存在共享,,如图。
2024-08-14 20:44:04
622
原创 Java并发编程-基础篇
程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至 CPU,数据加载至内存。在指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理 IO 的。当一个程序被运行,从磁盘加载这个程序的代码至内存,这时就开启了一个进程,进程是程序的一次执行。进程就可以视为程序的一个实例。大部分程序可以同时运行多个实例进程(例如记事本、画图、浏览器 等),也有的程序只能启动一个实例进程(例如网易云音乐、360 安全卫士等)
2024-06-25 23:19:15
974
1
原创 Java8新特性-Stream流
按照下面的要求完成集合的创建和遍历创建一个集合,存储多个字符串元素把集合中所有以"张"开头的元素存储到一个新的集合把"张"开头的集合中的长度为3的元素存储到一个新的集合遍历上一步得到的集合。
2024-06-17 10:27:44
1092
原创 Xxl-job实现定时任务视频转码
使用IDEA打开解压后的目录xxl-job-admin:调度中心xxl-job-core:公共依赖xxl-job-executor-samples:执行器Sample示例(选择合适的版本执行器,可直接使用)执行器的版本xxl-job-executor-sample-springboot:Springboot版本,;xxl-job-executor-sample-frameless:无框架版本;
2024-05-15 10:47:46
1040
原创 JVM-虚拟机栈
Java虚拟机栈(采用栈的数据结构来管理方法调用中的基本数据,先进后出(First In Last Out),每一个方法的调用使用一个栈帧(Stack Frame)来保存。接下来以这段代码为例main方法执行时,会创建main方法的栈帧:接下来执行study方法,会创建study方法的栈帧进入eat方法,创建eat方法的栈帧eat方法执行完之后,会弹出它的栈帧:然后调用sleep方法,创建sleep方法栈帧最后study方法结束之后弹出栈帧,main方法结束之后弹出main的栈帧。
2024-02-09 23:38:09
2007
10
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人