MySQL锁详解
一、锁概述锁是保证数据一致性和并发控制的重要机制。
锁的作用:
保证数据完整性
实现事务隔离
控制并发访问
二、锁的类型全局锁锁定整个数据库实例。
使用场景:
全库逻辑备份
数据迁移
12345-- 加全局读锁FLUSH TABLES WITH READ LOCK;-- 释放锁UNLOCK TABLES;
特点:
整个库只读
阻塞所有写操作
表级锁锁定整张表。
表锁12345678-- 加读锁LOCK TABLES table_name READ;-- 加写锁LOCK TABLES table_name WRITE;-- 释放锁UNLOCK TABLES;
读锁:可以读,不能写写锁:独占表,其他会话不能读写
元数据锁DDL操作自动加MDL锁。
MDL读锁:DML操作
MDL写锁:DDL操作
意向锁InnoDB支持,表示事务意图在表中的行上加锁。
意向共享锁(IS)
意向排他锁(IX)
作用:表锁和行锁兼容性判断。
行级锁InnoDB支持的细粒度锁。
Record Lock锁定单条记录。
1SELECT * FROM user WHERE id = 1 FOR U ...
MySQL事务详解
一、事务概述事务是一组数据库操作,要么全部成功,要么全部失败。
ACID特性原子性(Atomicity):
事务是不可分割的工作单位
要么都做,要么都不做
一致性(Consistency):
事务必须使数据库从一个一致性状态变换到另一个一致性状态
隔离性(Isolation):
多个事务并发执行时,互不干扰
持久性(Durability):
事务一旦提交,对数据库的改变是永久的
二、事务的使用基本语法1234567891011121314-- 开启事务START TRANSACTION;或BEGIN;-- 提交事务COMMIT;-- 回滚事务ROLLBACK;-- 设置保存点SAVEPOINT savepoint_name;ROLLBACK TO savepoint_name;
示例1234567START TRANSACTION;UPDATE account SET balance = balance - 100 WHERE id = 1;UPDATE account SET balance = balance + 100 WHERE id = 2;COMMIT;- ...
MySQL索引详解
一、索引概述索引是帮助MySQL高效获取数据的数据结构,相当于书的目录。
索引的作用:
加快数据检索速度
降低I/O成本
加速排序和分组
索引的代价:
占用存储空间
降低写操作性能(需要维护索引)
二、索引数据结构B+树MySQL使用B+树作为索引结构。
特点:
非叶子节点只存储键值和指针
叶子节点存储所有数据和指针
叶子节点通过双向链表连接
高度低,减少磁盘I/O
优势:
范围查询效率高
单节点存储更多键值,树更矮
天然排序
为什么不用B树B树:
每个节点存储数据
范围查询需要中序遍历
高度可能更高
B+树更适合:
叶子节点存储所有数据,便于范围查询
非叶子节点不存数据,单节点存储更多键值
三、索引类型主键索引数据表的主键自动创建索引。
1234CREATE TABLE user ( id INT PRIMARY KEY, name VARCHAR(50));
特点:
唯一且非空
InnoDB使用聚簇索引
唯一索引索引列的值必须唯一。
1CREATE UNIQUE INDEX idx_email ON user(email ...
MySQL查询技巧
一、基础查询SELECT语句1234567891011-- 查询所有列SELECT * FROM table_name;-- 查询指定列SELECT column1, column2 FROM table_name;-- 别名SELECT column1 AS alias_name FROM table_name;-- 去重SELECT DISTINCT column FROM table_name;
条件查询12345678910111213141516171819-- 基本条件SELECT * FROM table WHERE column = 'value';SELECT * FROM table WHERE column > 100;-- 多条件SELECT * FROM table WHERE condition1 AND condition2;SELECT * FROM table WHERE condition1 OR condition2;-- 范围查询SELECT * FROM table WHERE column BETWEEN 10 A ...
Linux和Shell常用命令
一、文件和目录操作目录操作123456789101112131415# 查看当前目录pwd# 切换目录cd /path/to/dircd ~ # 进入home目录cd - # 返回上一次目录# 创建目录mkdir dirmkdir -p a/b/c # 递归创建# 删除目录rmdir dir # 删除空目录rm -rf dir # 删除非空目录
文件操作12345678910111213141516171819202122# 创建文件touch file.txt# 复制文件cp source destcp -r dir1 dir2 # 复制目录# 移动或重命名mv source destmv oldname newname# 删除文件rm filerm -f file # 强制删除# 查看文件cat filemore file # 分页查看less file # 可上下翻页head -n 10 file # 查看前10行tail -n 10 file # 查看后10行tail -f file # 实时查看
查找和搜索123 ...
双亲委派模型详解
一、类加载过程类从加载到虚拟机到卸载,经历以下阶段:
加载将.class文件加载到内存,创建Class对象。
加载方式:
从本地文件系统加载
从网络获取
从zip包读取
运行时计算生成
连接验证:
文件格式验证
元数据验证
字节码验证
符号引用验证
准备:为类变量分配内存并设置初始值。
解析:将符号引用替换为直接引用。
初始化执行类构造器方法,初始化类变量和执行静态代码块。
二、类加载器启动类加载器Bootstrap ClassLoader,负责加载Java核心类库。
加载路径:
JAVA_HOME/lib/rt.jar
JAVA_HOME/lib/resources.jar
JAVA_HOME/lib/sunrt.jar
扩展类加载器Extension ClassLoader,负责加载扩展类库。
加载路径:
JAVA_HOME/lib/ext目录
应用类加载器Application ClassLoader,负责加载用户类路径上的类。
加载路径:
classpath路径
自定义类加载器继 ...
JVM垃圾回收器详解
一、如何判断对象已死引用计数法对象被引用时计数器加1,引用失效时减1,计数器为0表示可回收。
缺点:无法解决循环引用问题。
可达性分析从GC Roots开始搜索,搜索不到的对象即为可回收对象。
GC Roots包括:
虚拟机栈中引用的对象
方法区中类静态属性引用的对象
方法区中常量引用的对象
本地方法栈中JNI引用的对象
二、垃圾收集算法标记-清除算法分为标记和清除两个阶段。
缺点:
效率问题:标记和清除效率都不高
空间问题:产生大量不连续的内存碎片
复制算法将内存分为两块,每次使用一块,用完后将存活对象复制到另一块。
优点:实现简单,运行高效。缺点:内存利用率低。
改进:新生代中使用Eden:Survivor比例分配。
标记-整理算法标记后将存活对象向一端移动,然后清理端边界以外的内存。
优点:不会产生内存碎片。缺点:移动对象成本较高。
分代收集算法根据对象存活周期将内存划分为不同区域,采用不同算法。
新生代:复制算法老年代:标记-清除或标记-整理算法
三、垃圾收集器Serial收集器单线程收集器,进行垃圾收集时必须暂停其他线程。
特点:
简单高效
没有线程交互开销
适合客 ...
