📄🦌🙌🐟🏖️
日志记录
Where there is a where there is a way
随机文章
按住 Shift 横向滚动
热门文章
按住 Shift 横向滚动
InnoDB引擎底层原理

InnoDB引擎底层原理

InnoDB是MySQL默认存储引擎,支持事务和崩溃恢复。其**逻辑存储结构**包括表空间(`.ibd`文件)、段(数据段/索引段)、区(1MB)、页(16KB最小单元)及行(含隐藏字段`Trx_id`和`Roll pointer`)。**架构**分内存和磁盘:内存核心为**Buffer Pool**(缓存数据页,减少磁盘IO),配合Change Buffer(缓存非唯一索引变更)、Log Buffer(缓存Redo Log)和自适应哈希索引(加速等值查询);磁盘包含系统表空间、独立表空间、Undo表空间、临时表空间、Doublewrite Buffer(防页损坏)及Redo Log。**事务原理**:Redo Log保证持久性(WAL机制),Undo Log保证原子性(回滚和MVCC)。**MVCC**通过当前读(加锁读最新数据)和快照读(基于ReadView读取历史版本)实现读写不冲突,核心依赖undo log版本链和事务ID。

Mysql的锁

Mysql的锁

MySQL的锁机制是保证数据一致性和并发控制的核心。**按锁粒度**分为全局锁、表级锁和行级锁。**全局锁**锁定整个数据库实例,用于备份时保证数据一致性。**表级锁**包括表共享读锁(允许多读)、表独占写锁(完全独占)、元数据锁(隐式保护表结构)和意向锁(协调行锁与表锁)。**行级锁**是InnoDB的核心,包括记录锁(锁定单行)、间隙锁(锁定索引间隙防止幻读)、临键锁(记录锁+间隙锁,默认机制)和插入意向锁(优化并发插入)。行级锁并发度高但开销大,需合理设计索引避免退化为表锁。锁机制需结合事务隔离级别和索引优化使用。

触发器

触发器

触发器是一种与表关联的特殊存储过程,由表上的INSERT、UPDATE、DELETE事件自动触发执行,用于强制业务规则、维护数据一致性或记录日志。核心特性包括:事件驱动、支持BEFORE/AFTER触发时机、行级触发(每行变更触发一次)、不可显式调用。目前仅支持行级触发。 触发器类型中,INSERT型有NEW(新数据),DELETE型有OLD(旧数据),UPDATE型同时有NEW和OLD。创建语法为:`CREATE TRIGGER 触发器名 BEFORE/AFTER INSERT/UPDATE/DELETE ON 表名 FOR EACH ROW BEGIN ... END;`。查看用`SHOW TRIGGERS;`,删除用`DROP TRIGGER [库名.]触发器名;`。通过`NEW.字段名`和`OLD.字段名`访问对应数据。

存储过程与存储函数

存储过程与存储函数

存储过程是预编译的SQL语句集合,支持参数传递、流程控制和异常处理,具有预编译提升效率、代码封装、减少网络开销和权限控制等特点。基本语法包括创建(`CREATE PROCEDURE`)、调用(`CALL`)、查看(`SELECT * FROM information_schema.routines`)、删除(`DROP PROCEDURE`)。变量分系统变量(全局/会话)、用户自定义变量(`@变量名`)和局部变量(需`DECLARE`声明)。参数类型有IN(输入)、OUT(输出)、INOUT(输入输出)。条件判断用IF和CASE,循环有WHILE、REPEAT、LOOP(配合LEAVE/ITERATE)。游标用于存储查询结果集并循环处理,需配合条件处理程序(如`DECLARE EXIT HANDLER FOR SQLSTATE '02000'`)避免无限循环。存储函数是有返回值的存储过程(参数默认为IN),调用时使用`SELECT`,且需指定函数特性(如DETERMINISTIC)。

视图View

视图View

视图是一种虚拟表,由基表的查询结果动态生成,不存储实际数据。其特点包括动态更新、逻辑抽象、权限隔离和简化操作。创建视图使用`CREATE VIEW`语句,可自定义列名;查询、修改和删除分别对应`SELECT`、`CREATE OR REPLACE`/`ALTER`和`DROP VIEW`。通过`WITH CHECK OPTION`(支持`CASCADED`或`LOCAL`)可限制插入数据符合查询条件,其中`CASCADED`会递归检查所有依赖视图的约束,`LOCAL`仅检查当前及显式约束的视图。视图的更新要求行与基表一一对应,且不能包含聚合函数、`DISTINCT`、`GROUP BY`、`HAVING`、`UNION`等操作。视图的主要作用:简化复杂查询、提升安全性(控制用户访问特定行列)、实现数据独立(屏蔽基表变化)。

SQL优化

SQL优化

本文总结了MySQL数据库优化的七大策略: 1. **Insert优化**:采用批量插入、LOAD DATA INFILE、事务包裹减少I/O;调整InnoDB缓冲池、日志参数,或使用MyISAM应对高插入场景。 2. **主键优化**:InnoDB为索引组织表,顺序插入避免页分裂,页合并受MERGE_THRESHOLD控制;主键应短小、顺序递增、避免修改。 3. **Order by优化**:利用索引排序(using index)避免filesort;若无法避免,可增大sort_buffer_size。 4. **Group by优化**:为分组字段加索引,避免临时表(using tempory)。 5. **Limit优化**:避免大偏移量全表扫描,使用覆盖索引、游标分页、延迟关联或预计算分页元数据。 6. **Count优化**:InnoDB中count(*)效率最高,count(1)次之,count(字段)需判空;可用触发器维护计数器。 7. **Update优化**:更新时确保使用索引字段,否则行锁可能升级为表锁,降低并发性能。

MySql索引

MySql索引

MySQL索引是帮助数据库高效获取数据的有序数据结构(如B+Tree),能提升检索与排序效率,但会降低增删改性能并占用空间。InnoDB默认采用B+Tree索引,因其多叉低高度减少磁盘I/O、叶子节点链表支持范围查询、查询性能稳定,并支持聚簇索引与二级索引。索引按功能分为主键、唯一、普通、全文和组合索引,按存储分为聚簇与非聚簇索引。使用联合索引需遵循最左前缀原则,避免在索引列使用函数、隐式类型转换、OR连接非索引字段、前导模糊查询等导致索引失效。设计索引时,应对查询频繁、区分度高、常作为WHERE/ORDER BY/GROUP BY条件的字段建立索引,优先使用唯一索引和联合索引,控制索引数量,字符串字段可用前缀索引,建议列定义为NOT NULL。

MySQL存储引擎

MySQL存储引擎

MySQL存储引擎是表级别的技术实现,决定了数据的存储、索引和查询方式。InnoDB(5.5后默认)支持事务、行级锁、外键和ACID特性,采用表空间→段→区→页→行的逻辑存储结构,适合高并发写入场景。MyISAM以读速度快、存储空间小著称,但仅支持表级锁、无事务和崩溃恢复能力,适合只读或低并发场景。Memory引擎将数据完全存储在内存中,读写极快,但重启后数据丢失,仅支持表级锁,适合缓存、会话等临时数据。三种引擎在锁机制、索引类型、事务支持和适用场景上差异显著,实际开发需根据业务需求选择。

事务

事务

事务是一组不可分割的操作集合,要么全部成功要么全部失败。MySQL默认自动提交每条DML语句,但可通过BEGIN/START TRANSACTION显式开启事务,用COMMIT提交、ROLLBACK回滚。事务的四大特性(ACID):原子性依赖Undo Log回滚;一致性由数据库约束和应用逻辑保证;隔离性通过MVCC和锁机制(如Next-Key锁)实现,默认级别REPEATABLE READ避免脏读、不可重复读和幻读;持久性依赖Redo Log和Double Write Buffer确保提交后数据不丢失。

多表查询

多表查询

本文介绍了数据库中多表之间的关系(一对多、多对多、一对一)及其实现方式,重点讲解了多表查询的几种类型:内连接(隐式与显式)、外连接(左外与右外)、自连接、联合查询以及子查询(标量、列、行、表),并附有SQL语法示例。核心观点是掌握不同连接方式以有效消除笛卡尔积,获取所需关联数据。

© 2026 日志记录