← 返回首页
一、MySQL
存储引擎
- InnoDB(默认):支持事务、行锁、外键,聚簇索引,MVCC 实现非锁定读
- MyISAM:不支持事务和行锁,表锁,适合读密集场景,支持全文索引
索引
- B+ 树:非叶子节点只存 Key,叶子节点存数据且形成有序链表,适合范围查询
- 聚簇索引:主键索引,叶子节点存完整行数据;二级索引叶子节点存主键值(回表)
- 覆盖索引:查询列都在索引中,无需回表
- 索引失效:最左前缀不满足、对索引列函数运算、隐式类型转换、LIKE 以 % 开头、OR 连接非索引列
事务与锁
- ACID:原子性(undo log)、一致性(目标)、隔离性(MVCC+锁)、持久性(redo log)
- MVCC:通过 undo log 版本链 + ReadView 实现快照读,RC 每次读生成新 ReadView,RR 首次读生成
- 锁类型:行锁(Record Lock)、间隙锁(Gap Lock)、临键锁(Next-Key Lock,解决幻读)
- 死锁:等待超时 / 死锁检测(wait-for graph),尽量按固定顺序访问资源
优化
EXPLAIN 分析执行计划:关注 type(ALL→index→range→ref→const)、rows、Extra
- 慢查询日志:
slow_query_log,long_query_time 阈值设置
- 分库分表:垂直拆分(按业务)、水平拆分(按数据),ShardingSphere 中间件
二、Redis
数据结构
- String:SDS 动态字符串,可存字符串/数字/二进制,最大 512MB
- Hash:ziplist(小数据)/ hashtable,适合存对象
- List:quicklist(ziplist + 双向链表),支持阻塞弹出(BLPOP)
- Set:intset / hashtable;ZSet:ziplist / skiplist + hashtable
持久化
- RDB:快照,fork 子进程 + COW,恢复快但可能丢数据
- AOF:追加写命令日志,always/everysec/no 三种策略,AOF 重写压缩
- 混合持久化:RDB + AOF 增量,Redis 4.0+ 推荐
高可用
- 主从复制:全量同步(RDB)+ 增量同步(repl_backlog),异步复制
- Sentinel 哨兵:监控、自动故障转移、通知,至少 3 个哨兵节点
- Cluster 集群:16384 个 slot 分片,去中心化,Gossip 协议通信
常见问题
- 缓存穿透:查不存在的数据 → 布隆过滤器 / 缓存空值
- 缓存击穿:热点 Key 过期 → 互斥锁 / 逻辑过期
- 缓存雪崩:大量 Key 同时过期 → 随机过期时间 / 多级缓存
- 双写一致性:Cache Aside 模式(先更新 DB 再删缓存)+ 延迟双删
三、消息队列
RabbitMQ
- AMQP 协议,Exchange 类型:Direct / Fanout / Topic / Headers
- 消息可靠性:生产者 Confirm + 持久化 + 消费者手动 ACK
- 死信队列(DLX):消息被拒绝/TTL 过期/队列满时进入,可实现延迟队列
Kafka
- 分布式日志系统,Topic → Partition → Segment,顺序写磁盘 + 零拷贝
- 消费者组:组内每个 Partition 只被一个消费者消费,实现负载均衡
- 消息可靠性:acks=all + min.insync.replicas + 幂等生产者 + 事务消息
- 高吞吐原因:批量发送、压缩、顺序 IO、Page Cache、零拷贝(sendfile)
四、Elasticsearch
- 核心概念:Index(索引)→ Document(文档)→ Field(字段),分片(Shard)+ 副本(Replica)
- 倒排索引:Term → Posting List(文档 ID 列表),支持高效全文检索
- 分词器:Standard / IK(中文推荐,ik_max_word / ik_smart)
- 查询类型:match(分词匹配)/ term(精确匹配)/ bool(组合查询)/ aggs(聚合)
- 深分页问题:from+size 性能差 → search_after / scroll API
- 与 MySQL 同步:Canal 监听 binlog / Logstash / 双写