面试题答案
一键面试索引设计
- 原理:合适的索引可以让数据库快速定位到所需数据,减少全表扫描。例如,在经常用于查询条件的列上创建索引,查询时就能通过索引直接找到对应的数据行,而无需扫描整个表。
- 适用场景:对于高频查询条件涉及的列,如
WHERE
子句中常用的列,创建索引能显著提升查询效率。例如电商系统中按商品ID查询商品信息,在商品ID列创建索引。
事务隔离级别设置
- 读提交(Read Committed)
- 原理:一个事务只能读取已经提交的事务所做的修改,避免了脏读。事务执行过程中,每次读取数据都是最新已提交的数据版本。
- 适用场景:适用于大多数常规业务场景,对数据一致性要求较高但允许不可重复读的情况。例如银行转账时查询账户余额,允许看到最新已提交的余额变动。
- 可重复读(Repeatable Read)
- 原理:在一个事务内多次读取同一数据时,读取到的数据始终一致,即使在此期间其他事务修改并提交了该数据。MySQL通过MVCC(多版本并发控制)实现,事务开始时会记录一个数据版本号,后续读取都基于此版本号。
- 适用场景:适用于需要保证在事务内多次读取数据一致性的场景,如订单处理过程中多次读取订单状态,要求每次读取状态一致。
锁优化
- 行级锁
- 原理:只锁定被操作的行数据,而不是整个表。这样在高并发场景下,多个事务可以同时操作不同行的数据,减少锁争用。
- 适用场景:适合高并发且操作数据分散的场景,例如在线商城中用户各自下单,每个订单操作只涉及自己的相关行数据。
- 乐观锁
- 原理:假设数据一般情况下不会产生并发冲突,只在更新数据时检查数据是否被其他事务修改。通过版本号或时间戳实现,更新时对比版本号或时间戳,若不一致则更新失败。
- 适用场景:适用于读多写少的场景,如新闻网站浏览量统计,读操作远多于写操作,写操作时通过乐观锁更新浏览量。
分区表
- 原理:将大表按一定规则(如按时间、地域等)拆分成多个小的分区表,查询时只扫描相关分区,减少扫描范围。
- 适用场景:适合数据量巨大且有明显分区规则的场景,如日志表按日期分区,查询某段时间内日志只需扫描对应分区。