面试数据库八股文十问十答第十期
相信看了本文后,对你的面试是有一定帮助的!关注专栏后就能收到持续更新!
⭐点赞⭐收藏⭐不迷路!⭐
1)为什么不推荐多表Join?
多表 Join 在数据库查询中是常见的操作,但在某些情况下可能会导致性能问题:
- 性能影响: 当连接的表数量增加时,查询性能可能会下降。尤其是当连接的表中有大量数据或者没有合适的索引时,数据库引擎需要执行大量的数据扫描和内存操作,导致查询变慢。
- 复杂性增加: 多表 Join 可能会导致查询语句变得复杂难以理解和维护。特别是在连接多个表时,需要考虑连接条件、连接顺序等问题,容易出现错误。
- 并发性问题: 多表 Join 可能导致数据库锁的竞争增加,从而影响系统的并发性能。特别是在高并发场景下,多表 Join 可能会导致数据库资源争夺,降低系统的吞吐量。
因此,尽管多表 Join 是数据库查询中常用的操作,但在实际应用中需要谨慎使用,特别是在大数据量、高并发的场景下,需要考虑查询性能、复杂性和并发性等方面的问题。
2)MySQL 深度分页有什么解决思路?
在处理大数据量的情况下,如果需要进行深度分页(即跳过大量的行再进行查询),传统的 LIMIT offset, limit 查询可能会导致性能问题。因为数据库需要扫描并跳过 offset 行之前的数据,这会导致性能下降。以下是一些解决思路:
- 使用游标分页: 使用游标进行分页查询,可以避免数据库扫描和跳过 offset 行的问题。通过在每次查询中记录上次查询的最后一条记录的主键或唯一键值,然后基于这个键值进行下一次查询,可以实现高效的分页查询。
- 使用基于范围的分页: 通过记录上一次查询结果的最后一条记录的值,然后在下一次查询中使用 WHERE 条件限制范围,可以实现高效的分页查询。例如,
WHERE id > last_id ORDER BY id LIMIT page_size
。 - 使用缓存: 对于静态或者不经常变化的数据,可以将查询结果缓存起来,以提高分页查询的性能。可以使用内存缓存或者分布式缓存来实现。
- 优化查询语句: 对于复杂的查询语句,可以优化数据库的索引和查询计划,以提高查询性能。可以使用 Explain 或者 Profile 命令来分析查询语句的性能瓶颈,然后针对性地进行优化。
3)如何监控慢 SQL?
监控慢 SQL 对于及时发现和解决数据库性能问题非常重要。以下是一些常用的监控慢 SQL 的方法:
- 使用数据库性能监控工具: 可以使用数据库性能监控工具来监控数据库的性能指标和慢查询日志,例如 MySQL 的 Performance Schema 或者 Percona Toolkit。
- 配置慢查询日志: 可以在数据库服务器上配置慢查询日志,记录执行时间超过阈值的查询语句。可以通过分析慢查询日志来发现潜在的性能问题。
- 使用监控系统: 可以使用监控系统来监控数据库的性能指标和慢查询情况,例如 Prometheus、Datadog 等监控系统。
- 定期分析和优化: 定期分析数据库的性能指标和慢查询日志,发现潜在的性能问题,并进行优化。可以通过分析查询执行计划、添加索引、优化 SQL 语句等方式来提高查询性能。
- 实时警报: 可以配置实时警报机制,当发现慢查询或者性能异常时及时发送警报通知相关人员,以便及时处理和解决问题。
综上所述,监控慢 SQL 是数据库性能优化的重要手段,通过合适的监控工具和方法,可以及时发现和解决数据库性能问题,保障系统的稳定性和性能。
4)Delete、Drop、Truncate 有什么区别?
- DELETE: DELETE 语句用于从表中删除行,但保留表的结构。它会触发表的触发器(如果有的话),并且可以与 WHERE 子句一起使用来指定要删除的行。DELETE 语句执行后,表的空间不会释放,而是会留下被删除行的空间用于后续的插入。
- DROP: DROP 语句用于完全删除数据库中的表,包括表的结构和数据。执行 DROP 语句后,表的定义以及表中的所有数据都会被永久删除,无法恢复。
- TRUNCATE: TRUNCATE 语句用于从表中删除所有的行,但保留表的结构。与 DELETE 不同的是,TRUNCATE 语句不会触发表的触发器,并且通常比 DELETE 语句执行得更快,因为它不会记录删除的行。执行 TRUNCATE 后,表的空间会被释放,但表的定义仍然保留。
5)Inner Join、Left Join、Right Join 有啥区别?
- Inner Join(内连接): Inner Join 返回两个表中匹配行的交集。即只返回两个表中共同满足连接条件的行。如果一个表中没有匹配的行,则不会显示。
- Left Join(左连接): Left Join 返回左表中的所有行,以及右表中匹配的行。如果右表中没有匹配的行,则会用 NULL 填充。换句话说,无论右表中是否有匹配的行,左表中的每一行都会显示。
- Right Join(右连接): Right Join 和 Left Join 相反,它返回右表中的所有行,以及左表中匹配的行。如果左表中没有匹配的行,则会用 NULL 填充。换句话说,无论左表中是否有匹配的行,右表中的每一行都会显示。
6)索引失效的场景列举一下
索引失效通常是指数据库查询时,本应使用索引加速查询,但由于某些原因导致索引无法发挥作用,查询性能降低。以下是一些常见的索引失效场景:
- 未使用索引列: 当查询中的条件不是索引列,或者条件中使用了函数、类型转换等操作时,数据库可能无法使用索引。
- 使用不等于(!=): 不等于操作符(!=)通常无法利用索引,因为它不是一个范围查询,而是一个非范围查询。
- 使用 LIKE 操作符: 如果 LIKE 操作符的模式以通配符开头(例如 '%value'),索引也无法被利用。但如果模式不以通配符开头(例如 'value%'),索引可以被利用。
- 使用 OR 操作符: 当查询条件中使用 OR 操作符连接多个条件时,如果其中一个条件无法使用索引,整个查询可能都无法使用索引。
- 表达式索引失效: 当索引列参与了表达式、函数或者类型转换等操作时,索引可能会失效。
- 隐式类型转换: 当查询条件中的列类型与索引列的类型不匹配,或者类型需要进行隐式类型转换时,索引可能会失效。
- 统计信息不准确: 如果数据库的统计信息不准确,可能会导致数据库选择错误的执行计划,从而导致索引失效。
综上所述,索引失效可能会导致数据库查询性能下降,因此在设计数据库索引和查询时,需要注意避免以上列举的情况,以确保索引能够发挥应有的作用。
7)怎么查询索引是否被使用
要查看索引是否被查询使用,可以通过数据库的性能监控工具或者执行计划来进行检查。在大多数数据库系统中,可以使用以下方法:
- 执行计划(Explain): 使用数据库系统提供的 EXPLAIN 或类似的关键字,可以查看查询语句的执行计划。执行计划会显示查询是如何执行的,包括是否使用了索引。
- 性能监控工具: 大多数数据库系统提供了性能监控工具,可以用来监控数据库的性能指标。这些工具通常会显示每个查询的执行情况,包括是否使用了索引。
8)索引优化的例子举几个
索引优化是提高数据库查询性能的关键。以下是一些常见的索引优化例子:
- 选择合适的索引类型: 根据查询的特点选择合适的索引类型,如普通索引、唯一索引、组合索引等。
- 删除不必要的索引: 删除没有使用或者很少使用的索引,以减少索引维护的开销。
- 创建覆盖索引: 创建覆盖索引可以减少查询的 IO 操作,提高查询性能。
- 优化索引列顺序: 对于组合索引,将最常用的列放在前面可以提高索引的效率。
- 避免使用 SELECT *: 尽量避免使用 SELECT * 查询所有列,而是只查询需要的列,以减少索引的使用和 IO 操作。
9)数据库常用引擎有哪些?
常用的数据库引擎包括但不限于:
- MySQL: InnoDB、MyISAM、Memory、Archive 等。
- PostgreSQL: PostgreSQL 默认引擎、PostgreSQL 后端引擎。
- SQL Server: SQL Server 默认引擎、SQL Server 后端引擎。
- Oracle: Oracle 默认引擎、Oracle 后端引擎。
- SQLite: SQLite 默认引擎。
不同的数据库引擎具有不同的特点和适用场景,选择合适的引擎取决于具体的需求和情况。
10)数据库事务是什么意思?
数据库事务是指一组数据库操作,要么全部成功执行,要么全部失败回滚,保证数据库的一致性和完整性。事务具有以下四个特性,通常被称为 ACID 特性:
- 原子性(Atomicity): 事务中的所有操作要么全部执行成功,要么全部失败回滚,不存在部分执行的情况。
- 一致性(Consistency): 事务在执行前后,数据库的状态应保持一致性。即数据库的完整性约束应得到满足。
- 隔离性(Isolation): 事务之间应该相互隔离,一个事务的执行不应该影响其他事务的执行。数据库系统需要保证事务之间的隔离性,以避免并发执行时出现问题。
- 持久性(Durability): 一旦事务提交,其对数据库的修改应该是永久性的,即使发生系统崩溃或断电等故障,数据库的状态也应该能够恢复到事务提交后的状态。
事务可以通过 BEGIN TRANSACTION、COMMIT、ROLLBACK 等语句来控制。在数据库应用中,事务通常用于保证复杂操作的一致性,确保数据的完整性和可靠性。
开源项目地址:https://gitee.com/falle22222n-leaves/vue_-book-manage-system
前后端总计已经 1300+ Star,2W+ 访问!
⭐点赞⭐收藏⭐不迷路!⭐