
书: https://pan.baidu.com/s/1o53U8DJYBlzPKes4X47C8Q?pwd=ymj8
笔记如下:
- “MySQL的存储引擎架构将核心服务层(如SQL解析)与底层存储(如InnoDB、MyISAM)解耦。”
- “InnoDB的聚簇索引(Clustered Index)将数据行直接存储在B+树叶子节点,主键查询极快。”
- “事务的ACID特性通过InnoDB的undo log(原子性)、redo log(持久性)和锁机制(隔离性)实现。”
- “
EXPLAIN
输出中的type
列揭示查询访问类型:ALL
(全表扫描)最差,const
(主键)最优。” - “复合索引遵循最左前缀原则,索引
(a,b,c)
无法优化WHERE b=1
的查询。” - “
JOIN
操作应确保关联字段有索引,避免笛卡尔积(Cartesian Product)导致性能灾难。” - “慢查询日志(slow_query_log)定位性能瓶颈,
long_query_time
定义阈值(默认10秒)。” - “分页查询优化:
LIMIT 10000,20
改为WHERE id > 10000 LIMIT 20
,避免偏移量过大。” - “
VARCHAR
变长字符串节省空间,但CHAR
定长更适合频繁更新的短字段(如邮编)。” - “批量插入用
INSERT INTO ... VALUES (...), (...), ...
替代多次单条插入,提升10倍性能。” - “
utf8mb4
字符集支持完整Unicode(如emoji),替代有缺陷的utf8
(仅3字节存储)。” - “主从复制(Replication)通过binlog实现,配置
server_id
和log_bin
开启。” - “
mysqldump --single-transaction
备份InnoDB表时不会锁表,利用事务一致性快照。” - “死锁(Deadlock)可通过
SHOW ENGINE INNODB STATUS
分析,应用端应实现重试机制。” - “
ORDER BY
与GROUP BY
的列不一致时,可能触发临时表(Using temporary)和文件排序(Using filesort)。” - “分区表(Partitioning)按范围/列表/哈希拆分大表,但需注意分区键选择和查询条件匹配。”
- “连接池(如C3P0)减少连接创建开销,
wait_timeout
控制空闲连接自动断开时间。” - “
sql_mode
严格模式(如STRICT_TRANS_TABLES
)阻止无效数据插入,避免静默截断。” - “内存调优:
innodb_buffer_pool_size
设为物理内存70%-80%,缓存表数据和索引。” - “监控关键指标:QPS(Queries Per Second)、线程池状态(
SHOW STATUS LIKE 'Threads%'
)、锁等待时间。”