mysql详细知识点
MySQL 基础架构
MySQL 采用分层架构,分为连接层、服务层、引擎层和存储层。
- 连接层:处理客户端连接、认证和权限验证。
- 服务层:解析SQL语句、优化查询、缓存结果。
- 引擎层:插件式存储引擎(如InnoDB、MyISAM),负责数据存储和检索。
- 存储层:数据文件、日志文件(如redo log、binlog)。
存储引擎对比
InnoDB:
- 支持事务、行级锁、外键约束。
- 默认引擎,适用高并发写入场景。
- 使用聚簇索引,数据文件与主键索引绑定。
MyISAM:
- 不支持事务,表级锁,读性能高。
- 适用读多写少的场景(如数据仓库)。
- 索引文件(.MYI)与数据文件(.MYD)分离。
索引机制
B+树索引:
- InnoDB默认索引结构,叶子节点存储数据或主键指针。
- 适合范围查询(如
WHERE id > 100
)。
哈希索引:
- 仅支持等值查询(如
WHERE id = 10
),不支持排序。
全文索引:
- 用于文本搜索(如
MATCH(content) AGAINST('keyword')
)。
索引优化原则:
- 遵循最左前缀匹配原则。
- 避免对索引列使用函数或计算(如
WHERE YEAR(create_time) = 2023
)。
事务与隔离级别
ACID特性:
- 原子性(Undo Log)、一致性(约束检查)、隔离性(锁/MVCC)、持久性(Redo Log)。
隔离级别:
- 读未提交:可能读到未提交数据(脏读)。
- 读已提交:解决脏读,但存在不可重复读。
- 可重复读(MySQL默认):解决不可重复读,可能幻读。
- 串行化:最高隔离级别,性能最低。
锁机制
行锁:
- InnoDB通过索引实现,锁住符合条件的行。
- 若未走索引,退化为表锁。
间隙锁(Gap Lock):
- 在可重复读级别下防止幻读,锁定索引记录间的间隙。
死锁处理:
- 超时机制或死锁检测(
innodb_deadlock_detect=ON
)。
日志系统
Redo Log(重做日志):
- 物理日志,记录页的修改,用于崩溃恢复。
- 写入流程:先写日志(WAL),再写磁盘。
Undo Log(回滚日志):
- 逻辑日志,记录事务前的数据版本,用于回滚和MVCC。
Binlog(归档日志):
- 服务层日志,记录所有DDL和DML,用于主从复制和数据恢复。
性能优化
SQL优化:
- 使用
EXPLAIN
分析执行计划,关注type
(访问类型)、key
(使用索引)。 - 避免
SELECT *
,减少全表扫描。
配置调优:
- 调整
innodb_buffer_pool_size
(通常设为物理内存的70%-80%)。 - 合理设置
innodb_log_file_size
(减少磁盘I/O)。
分库分表:
- 水平拆分(按行分散到不同表)。
- 垂直拆分(按列拆分到不同表)。
主从复制
原理:
- 主库将变更写入Binlog。
- 从库的IO线程读取Binlog并写入Relay Log。
- 从库的SQL线程重放Relay Log中的事件。
复制模式:
- 异步复制(默认):主库不等待从库确认。
- 半同步复制:至少一个从库接收日志后主库才提交。
高可用方案
MHA(Master High Availability):
- 自动监控主库故障,提升从库为新主。
Group Replication:
- 基于Paxos协议的多主复制,保证数据一致性。
常见问题
慢查询排查:
- 开启慢查询日志(
slow_query_log=ON
)。 - 使用
pt-query-digest
工具分析日志。
大表优化:
- 分区表(按范围、哈希等拆分)。
- 归档历史数据(如按时间归档到备份表)。
以上内容涵盖MySQL的核心知识点,实际应用中需结合具体场景调整配置和优化策略。