面试题答案
一键面试1. 锁类型特性对比
- 表级锁
- 加锁方式:对整个表加锁。
- 并发性能:加锁快,开销小,但锁粒度大,会影响其他事务对表中其他数据的访问,并发度低。
- 适用场景:适用于以查询为主,写操作较少,或者表数据量较小的场景。
- 行级锁
- 加锁方式:仅对操作的行加锁。
- 并发性能:锁粒度小,并发度高,但加锁开销大,容易出现死锁。
- 适用场景:适用于高并发的OLTP系统,数据修改频繁且要求并发度高的场景。
- 页级锁
- 加锁方式:以页(数据存储的逻辑单位)为单位加锁。
- 并发性能:锁粒度介于表级锁和行级锁之间,并发度和加锁开销也介于两者之间。
- 适用场景:适用于既有一定并发度,又希望加锁开销相对较小的场景。
2. 不同业务场景下的性能优劣
- OLTP场景
- 表级锁
- 优势:加锁快,适合在写操作较少且数据一致性要求不高的场景下,如某些简单的报表生成。
- 劣势:并发度低,大量并发写操作时,容易出现锁争用,性能急剧下降。
- 行级锁
- 优势:高并发下,能最大程度提高并发度,保证数据一致性,适合对数据实时性要求高的业务,如电商的库存扣减。
- 劣势:加锁开销大,死锁风险高,在高并发下如果处理不当,会频繁出现死锁导致事务回滚,影响性能。
- 页级锁
- 优势:相比行级锁,加锁开销小;相比表级锁,并发度较高,适用于并发度适中,对加锁开销敏感的场景。
- 劣势:锁粒度不如行级锁灵活,并发度上限不如行级锁高;加锁开销又比表级锁大。
- 表级锁
- OLAP场景
- 表级锁
- 优势:OLAP主要是读操作,表级锁加锁快,能快速对整个表进行扫描,适合数据分析类的全表查询场景。
- 劣势:如果有写操作,会严重影响并发性能,因为表级锁会锁住整个表。
- 行级锁
- 优势:对于OLAP中可能存在的少量数据更新操作,行级锁能保证对其他数据的读操作不受影响,保证数据一致性。
- 劣势:对于OLAP大量的读操作,行级锁加锁开销大,且高并发读时,频繁加锁解锁会降低性能。
- 页级锁
- 优势:介于表级锁和行级锁之间,对于既有读又有少量写的OLAP场景,能在一定程度上平衡性能和并发度。
- 劣势:读操作时,页级锁相比表级锁会有更多的锁开销;写操作时,并发度又不如行级锁。
- 表级锁
3. OLTP系统优化配置与调优
- 读多写少场景
- 配置:可以适当增加表级锁的使用,如设置
lock_wait_timeout
参数,合理设置等待锁的超时时间,减少锁等待造成的性能损耗。同时,对于热点数据行,可以使用行级锁,但要通过合理的索引设计,减少行锁冲突。 - 调优:开启
innodb_read_only
参数,对于只读事务使用一致性读,避免锁争用。
- 配置:可以适当增加表级锁的使用,如设置
- 读写均衡场景
- 配置:以行级锁为主,合理设计索引,确保行锁能够准确命中。同时,适当调整
innodb_lock_wait_timeout
参数,减少死锁等待时间。 - 调优:开启
innodb_autoinc_lock_mode
参数,采用合适的自增锁模式,减少锁争用。对于批量操作,可以考虑使用页级锁,但要注意页的划分和锁的释放。
- 配置:以行级锁为主,合理设计索引,确保行锁能够准确命中。同时,适当调整
- 写多读少场景
- 配置:优先使用行级锁,确保每次写操作的粒度最小。同时,设置合理的
innodb_flush_log_at_trx_commit
参数,在保证数据安全性的前提下,提高写性能。 - 调优:对于频繁更新的行,可以考虑将相关数据合并,减少锁的数量。对于并发写操作,可以采用排队机制,避免过多的锁争用。
- 配置:优先使用行级锁,确保每次写操作的粒度最小。同时,设置合理的