最近正在复习Java八股,所以会将一些热门的八股问题,结合ai与自身理解写成博客便于记忆
InnoDB 和 MyISAM 的区别
特性 | InnoDB | MyISAM |
---|---|---|
事务支持 | 支持ACID事务 | 不支持事务 |
锁机制 | 行级锁 | 表级锁 |
外键支持 | 支持 | 不支持 |
崩溃恢复 | 有crash-safe能力 | 无 |
存储结构 | 聚簇索引 | 非聚簇索引 |
全文索引 | MySQL 5.6+支持 | 支持 |
COUNT(*)效率 | 需要扫描全表 | 有单独计数器,效率高 |
适用场景 | 高并发、事务性操作 | 读多写少、不需要事务 |
主从复制的原理
-
基本流程:
- 主库(binary log)记录所有数据变更
- 从库(I/O thread)请求主库的binlog
- 主库(binlog dump thread)发送binlog给从库
- 从库(SQL thread)重放(replay)binlog中的事件
-
复制模式:
- 异步复制(默认):主库不等待从库确认
- 半同步复制:至少一个从库接收并确认后才提交
- 组复制(MySQL Group Replication):基于Paxos协议的多主复制
-
binlog格式:
- STATEMENT:记录SQL语句
- ROW:记录行变化(默认)
- MIXED:混合模式
RR 和 RC 的区别
RR(Repeatable Read)可重复读 vs RC(Read Committed)读已提交
特性 | RR | RC |
---|---|---|
隔离级别 | 可重复读(默认) | 读已提交 |
幻读问题 | 可能发生(但InnoDB通过MVCC避免) | 不会发生 |
一致性视图 | 事务开始时创建 | 每条语句开始时创建 |
锁定范围 | 范围锁 | 只锁定已提交的行 |
性能 | 较低 | 较高 |
为什么互联网公司选择使用 RC
- 性能优势:RC的并发度更高,锁冲突更少
- 减少死锁:锁定范围小,减少死锁概率
- 业务需求:多数互联网应用不需要严格的RR隔离
- 与ORM框架配合:许多框架默认使用RC
- MVCC实现:InnoDB的MVCC在RC下更符合直觉
- 避免过度锁定:RR可能导致范围锁影响性能
查询关键字的执行顺序
SQL语句的逻辑执行顺序:
- FROM + JOIN:确定数据来源
- WHERE:过滤行数据
- GROUP BY:分组
- HAVING:过滤分组
- SELECT:选择列
- DISTINCT:去重
- ORDER BY:排序
- LIMIT/OFFSET:分页
注意:这是逻辑顺序,实际执行计划可能由优化器调整。
聚簇索引和非聚簇索引的区别
特性 | 聚簇索引 | 非聚簇索引 |
---|---|---|
存储方式 | 索引和数据存储在一起(B+树叶子节点包含行数据) | 索引和数据分开存储 |
数量限制 | 每表只能有一个 | 每表可以有多个 |
查询效率 | 主键查询极快 | 需要回表查询 |
插入速度 | 依赖插入顺序 | 相对独立 |
更新代价 | 高(可能引起页分裂) | 相对较低 |
典型例子 | InnoDB的主键索引 | MyISAM的所有索引 |
InnoDB注意事项:
- 如果没有主键,会自动选择唯一非空列作为聚簇索引
- 如果没有合适列,会隐式创建一个6字节的ROWID作为聚簇索引
- 二级索引(非聚簇)存储的是主键值而非物理地址