RSS
菜单
社区成员个人主页
阿成员
DEV CN / 成员主页

阿青 · 社区话题账号

查看阿青 · 社区话题账号发布的技术文章、关注圈子与公开讨论。

0技术文章4关注圈子463圈内发布1关注者
COMMUNITY POSTS

交流圈发布内容

作者在不同技术圈子中的观点与讨论

1
# MySQL

MySQL Memory 引擎和临时表是什么?

MEMORY(HEAP)引擎:数据全存内存、极快,但:① 重启/崩溃数据丢失(仅临时用);② 表锁、不支持事务/外键;③ 行长度限制(变长类型用 varchar 有问题)、max_heap_table_size 限制容量。适用:缓存型小表、会话状态、临时汇总。临时表:CREATE TEMPORARY TABLE(会话级,自动销毁)、SQL 内部生成的临时表(GROUP BY/ORDER BY 大结果,磁盘临时表用 tmpdir);监控…

2
# MySQL

MySQL MyISAM 引擎还适用吗?

MyISAM 特点:① 只支持表锁、无事务(性能在低并发读多场景可观);② 全文索引原生;③ 索引文件与数据文件分离(.MYD/.MYI),压缩表省空间;④ 崩溃易损坏需 REPAIR。现状:MySQL 8.0 中已很少使用(InnoDB 已支持全文索引、性能更好),适用场景:只读归档表、临时统计表、明确不需要事务的极低并发场景。面试点:理解两者差异即可,选型基本 InnoDB;部分云版本已移除 MyISAM 支持。

3
# MySQL

MySQL InnoDB 为什么支持事务?redo log 两阶段提交是什么?

InnoDB 通过四件套支持事务:undo log(原子性:回滚)、锁+MVCC(隔离性)、redo log(持久性:WAL 崩溃恢复)、约束与日志(一致性)。redo log 两阶段提交:更新事务写 redo log(prepare 状态)→ 写 binlog → redo log 置 commit——保证 binlog 与 redo log 一致(否则崩溃后主从数据不一致)。崩溃恢复流程:扫描 redo log,prepare 且…

4
# MySQL

MySQL InnoDB 和 MyISAM 有什么区别?

① 事务:InnoDB 支持事务(ACID)、MyISAM 不支持;② 锁:InnoDB 行锁+表锁,MyISAM 仅表锁;③ 外键:InnoDB 支持,MyISAM 不支持;④ 崩溃恢复:InnoDB 通过 redo log 自动恢复,MyISAM 需修复(易损坏);⑤ 存储:InnoDB 聚簇索引(数据按主键组织),MyISAM 索引与数据分离(非聚簇);⑥ 全文索引:MyISAM 原生支持,InnoDB 5.6+ 支持;⑦ 并发:…

5
# MySQL

MySQL 长事务是什么?有什么危害?怎么避免?

长事务:执行时间长、未及时提交的事务。危害:① 锁持有久,阻塞其他事务(并发下降);② undo log 无法清理,回滚段膨胀(占用空间、MVCC 版本链变长拖慢查询);③ 主从复制延迟(binlog 集中提交);④ 崩溃恢复耗时长。避免:① 事务内只做必要操作,避免慢查询/远程调用/循环更新;② 及时 COMMIT(小事务化,如批量插入分批提交);③ 监控:information_schema.innodb_trx 查长事务告警;④…

6
# MySQL

MySQL 事务的提交和回滚机制是怎样的?

提交(COMMIT):事务修改生效,redo log 刷盘(组提交优化)、binlog 落盘、释放锁、MVCC 版本对外可见;回滚(ROLLBACK):利用 undo log 把数据恢复修改前状态(版本链逆向应用),undo log 本身保留(供 MVCC 旧版本读取,purge 线程清理)。关键流程(更新事务):写 undo log(回滚段)→ 修改 Buffer Pool 页 → 写 redo log(prepare)→ 写 bin…

7
# MySQL

MySQL 两阶段锁协议是什么?

两阶段锁(2PL):事务中所有加锁操作在解锁操作之前——扩展阶段(只加锁不解锁)+ 收缩阶段(只解锁不加锁)。InnoDB 实现:事务执行中遇到需要的记录逐步加锁(扩展),事务提交/回滚时统一释放(收缩)。作用:保证事务隔离性(基于锁的调度可串行化)。相关:两阶段提交(2PC)是分布式事务协议(prepare + commit 两阶段),与两阶段锁不同概念,注意区分。实践含义:事务中加锁越多越久,冲突概率越高——尽量缩短事务。

8
# MySQL

MySQL 当前读和快照读的区别?

快照读(普通 SELECT):读 MVCC 快照版本,不加锁、不阻塞、性能好;RR 下整个事务读同一快照(可重复读)。当前读(锁定读):SELECT ... FOR UPDATE(X 锁)、SELECT ... LOCK IN SHARE MODE(S 锁)、UPDATE/DELETE/INSERT——读最新已提交数据并加锁,其他事务的写被阻塞。应用:库存扣减(UPDATE 即当前读,原子)、账户余额操作、需要即时一致性的读取。理解:快…

9
# MySQL

MySQL 死锁怎么产生?怎么解决?

死锁:两个事务互相持有对方需要的锁且等待。示例:T1 锁行 A 等行 B,T2 锁行 B 等行 A。InnoDB 处理:死锁检测(等待图)自动回滚代价较小的事务(ERROR 1213 Deadlock found),不需人工干预;也支持 innodb_lock_wait_timeout 超时。预防:① 加锁顺序一致(按固定顺序访问多行,如先小 id 后大 id);② 一次尽量锁少行(缩小事务范围);③ 事务尽量短(少持锁);④ 避免大事…

10
# MySQL

MySQL 的锁有哪些类型?

按粒度:表锁(MyISAM 默认、DDL)、行锁(InnoDB 默认,锁索引记录)、页锁;按模式:共享锁 S(读锁,可共存)、排他锁 X(写锁,互斥);行锁细分:记录锁(Record Lock,锁单行)、间隙锁(Gap Lock,锁区间防插入)、Next-Key Lock(记录+间隙,RR 默认,防幻读);意向锁(IS/IX):表级标记,表示事务准备加行锁,用于快速判断表级锁兼容;其他:自增锁(AUTO-INC)、MDL 锁(元数据)。…