面试题答案
一键面试数据量
- 基表数据量:视图基于基表构建,若基表数据量庞大,每次查询视图时需处理的数据就多,性能易受影响。例如一张记录多年销售数据且有百万行的基表,基于它的视图查询会较慢。
- 关联数据量:当视图涉及多表关联,关联表的数据量总和对性能影响大。如视图关联三张各有十万行数据的表,关联操作的数据量是三十万行量级,可能导致性能瓶颈。
查询复杂度
- 连接类型:不同连接类型(内连接、外连接等)性能不同。外连接通常比内连接复杂,尤其左外连接或右外连接需保留一侧表所有记录,可能产生大量中间数据,影响视图性能。例如视图中使用复杂的多表外连接来获取客户及其所有订单(包括无订单客户),性能会比简单内连接差。
- 聚合操作:视图中若存在分组(GROUP BY)、求和(SUM)、计数(COUNT)等聚合操作,会增加查询复杂度。如视图要统计每个部门的平均工资,需对数据进行分组和计算,数据量越大性能影响越明显。
- 子查询:视图中嵌套子查询会使查询执行计划变复杂。尤其多层子查询,数据库需多次解析和执行,性能损耗大。例如视图通过子查询先找出销售额前10%的产品,再基于此结果做其他查询,会降低性能。
索引
- 基表索引:若基表缺乏合适索引,视图查询性能受影响。比如视图经常按某个字段过滤数据,而基表该字段无索引,查询时只能全表扫描,性能不佳。如视图按客户名称查询客户信息,客户名称字段无索引,查询效率低。
- 覆盖索引:若视图查询涉及多个字段,覆盖索引能提高性能。当索引包含查询所需所有字段,数据库无需回表操作,直接从索引获取数据,提升视图查询速度。
数据库配置
- 缓冲池大小:缓冲池用于缓存数据库数据和索引,若其大小设置不合理,视图查询时频繁从磁盘读取数据,性能下降。如缓冲池过小,无法缓存视图涉及的基表数据和索引,每次查询都需磁盘I/O。
- 查询缓存:MySQL查询缓存可缓存查询结果,若视图查询结果经常不变,合理配置查询缓存可提高性能。但查询缓存对数据变化敏感,基表数据更新频繁时,查询缓存命中率低,甚至可能因维护缓存带来额外开销。