面试题答案
一键面试数据库架构调整
- 读写分离
- 原理:将数据库的读操作和写操作分离到不同的数据库服务器上。主库负责处理写操作(INSERT、UPDATE、DELETE),从库负责处理读操作(SELECT)。应用程序根据操作类型将请求分发到对应的库。
- 预期效果:减轻主库的压力,提高读操作的性能。在高并发读场景下,从库可以分担读请求,避免主库因大量读操作而导致性能下降。同时,写操作也能更高效地在主库上执行,因为读操作不会干扰写操作。
- 分库分表
- 原理:
- 垂直分库:按照业务模块将不同的表划分到不同的数据库中。例如,将商品表products和与商品相关的表放在商品库,订单表orders和相关表放在订单库,用户表users及相关表放在用户库。这样每个库的压力相对独立。
- 水平分表:对于数据量特别大的表,如订单表orders,按照一定的规则(如按时间、用户ID哈希等)将数据分散到多个表中。例如,按月份将订单表分成12个表,每个表存储一个月的订单数据。
- 预期效果:垂直分库可以减少单个数据库的负担,提高整体性能,并且有利于维护和扩展。水平分表能有效降低单个表的数据量,从而加快查询速度,特别是在高并发查询时,减少锁争用。
- 原理:
索引优化
- 单表索引
- 原理:在经常用于查询条件的列上创建索引。在products表的product_id列、orders表的product_id和user_id列、users表的user_id列上创建索引。索引就像一本书的目录,通过索引可以快速定位到满足条件的数据行,而无需全表扫描。
- 预期效果:大大提高单表查询的速度,在JOIN操作时,能快速定位到关联数据,减少查询时间。
- 联合索引
- 原理:对于涉及多个条件的查询,创建联合索引。例如,如果经常查询某个用户在某个时间段内的订单,在orders表的(user_id, order_time)列上创建联合索引。联合索引的顺序很重要,一般将选择性高(重复值少)的列放在前面。
- 预期效果:提高复杂查询的效率,在JOIN操作中,联合索引能更精准地定位数据,减少不必要的数据扫描,从而提升整体性能。
查询语句优化
- **避免使用SELECT ***
- 原理:SELECT *会查询表中的所有列,包括一些不必要的列,增加了数据传输量和查询处理时间。只选择需要的列,可以减少数据传输和处理的开销。
- 预期效果:加快查询速度,减少网络传输压力,特别是在高并发场景下,能有效提升系统性能。
- 合理使用JOIN类型
- 原理:
- INNER JOIN:只返回两个表中匹配的行。在订单查询中,如果只关心有订单的商品和用户,使用INNER JOIN是合适的。
- LEFT JOIN:返回左表中的所有行,以及右表中匹配的行。如果需要展示所有商品,即使某些商品没有订单,就可以使用LEFT JOIN。要根据业务需求选择合适的JOIN类型,避免不必要的数据返回。
- 预期效果:通过选择合适的JOIN类型,减少返回的数据量,提高查询效率,降低数据库和应用程序的处理压力。
- 原理:
缓存策略
- 应用层缓存
- 原理:在应用程序中使用缓存,如Memcached或Redis。对于一些不经常变化的查询结果,如热门商品的订单统计信息,将查询结果缓存起来。当有相同的查询请求时,直接从缓存中获取数据,而不经过数据库查询。
- 预期效果:大大减少数据库的查询压力,提高响应速度。在高并发场景下,缓存可以避免大量重复查询对数据库造成的性能瓶颈。
- 数据库查询缓存(MySQL Query Cache,已弃用但可了解原理)
- 原理:MySQL自身曾经提供过查询缓存功能,它会缓存查询语句及其结果。当相同的查询再次执行时,直接从缓存中返回结果,而不需要重新执行查询。
- 预期效果:减少查询执行时间,提高数据库性能。但由于其维护成本较高,在MySQL 8.0中已弃用。现在可以使用其他缓存方案替代。