面试题答案
一键面试- 减少锁粒度:
- MariaDB将大的锁拆分成多个小锁,例如在InnoDB存储引擎中,对数据页、行记录等不同层级采用不同粒度的锁。这样不同线程可以同时访问不同部分的数据,降低锁争用。比如在插入多条记录时,每个记录行的锁相互独立,减少了对整表锁的依赖。
- 读写锁分离:
- 区分读操作和写操作的锁类型。读操作使用共享锁(S锁),允许多个线程同时读取数据;写操作使用排他锁(X锁),同一时间只允许一个线程进行写操作。这样在读多写少的场景下,能大大提高并发读的效率,减少写操作对读操作的阻塞。例如多个查询语句可以同时执行,而写操作必须等待所有读操作完成。
- 锁的优化算法:
- 采用先进先出(FIFO)或基于优先级的锁调度算法。FIFO算法确保锁请求按照顺序处理,避免某些线程长时间等待。基于优先级的算法则根据任务的优先级分配锁,例如对于一些关键业务的写操作给予较高优先级,尽快获取锁执行,提高整体系统性能。
- 自适应哈希索引:
- MariaDB通过自适应哈希索引,当发现某些数据访问频繁时,自动创建哈希索引。这使得查询时可以更快速定位数据,减少锁等待时间。比如对于频繁查询的某类数据,自适应哈希索引能加速查找,减少锁争用的概率。
- 锁升级与降级策略:
- 当一个事务持有多个细粒度锁时,如果发现继续使用细粒度锁的开销大于升级为粗粒度锁的开销,就进行锁升级,例如从行锁升级为表锁。而在事务执行过程中,若某些数据不再需要保持高并发控制,就进行锁降级,从粗粒度锁降为细粒度锁,以提高并发度。