索引
B+ 树是 MySQL InnoDB 的默认索引结构。非叶子节点仅存键值,叶子节点存完整记录并形成有序链表。树高低、范围查询高效(顺序扫描叶子即可)。
聚簇索引:主键索引的叶子节点直接存行数据,表按主键物理有序。二级索引叶子存主键,回表指通过主键再查聚簇索引取完整行。
覆盖索引:查询列均在索引中,无需回表,性能最佳。最左前缀:联合索引 (a,b,c) 可支持 a、a,b、a,b,c 的查询,不支持 b、c 单独查询。
索引失效:函数、类型隐式转换、前导模糊匹配(like '%x')、OR 一侧无索引等会导致全表扫描。
事务
ACID:原子性(Undo Log)、一致性(业务 + 约束)、隔离性(MVCC + 锁)、持久性(Redo Log)。
隔离级别:读未提交、读已提交(RC)、可重复读(RR)、串行化。MySQL 默认 RR。RC 有不可重复读;RR 通过 MVCC 和间隙锁减少幻读。
MVCC:多版本并发控制,通过 undo log 和 read view 实现快照读,读不加锁,写加锁。提高并发。
死锁:多事务互相等待。预防:固定加锁顺序、短事务;检测:等待图;解决:回滚代价小的事务。
优化
EXPLAIN:看 type(const/ref/range/index/all)、key、rows、Extra(Using index/Using filesort 等)。
SQL 优化:避免 SELECT *、减少子查询、用 JOIN 替代 IN、分页用延迟关联。表设计:合理范式、适度冗余、分区/分表。
读写分离:主写从读,主从延迟需考虑。分库分表:按业务或哈希分片,注意跨分片查询、分布式事务。