面试题答案
一键面试- 分析查询语句
- 假设查询语句形式如下(伪代码示例):
SELECT A.id, COUNT(B.value), SUM(C.amount) FROM A JOIN B ON A.common_id = B.common_id JOIN C ON A.common_id = C.common_id WHERE A.status = 'active' AND B.category ='specific' GROUP BY A.id ORDER BY COUNT(B.value) DESC;
- 索引设计思路与依据
- 关联字段索引:
- 由于表
A
、B
、C
通过common_id
进行连接,在A.common_id
、B.common_id
和C.common_id
上分别创建索引。这是因为索引可以加快连接操作,在连接时数据库可以利用索引快速定位匹配的行。例如在A
表中,通过A.common_id
索引能够快速找到与B
和C
表中匹配的行,减少全表扫描的开销。 - 索引创建语句:
CREATE INDEX idx_a_common_id ON A(common_id); CREATE INDEX idx_b_common_id ON B(common_id); CREATE INDEX idx_c_common_id ON C(common_id);
- 由于表
- 过滤条件字段索引:
- 对于过滤条件
A.status = 'active' AND B.category ='specific'
,在A.status
和B.category
上创建索引。索引可以帮助数据库快速定位满足条件的行,避免全表扫描。例如对于A
表,当有A.status
索引时,查询只需要在索引中查找status
为active
的行,而不需要扫描整个A
表。 - 索引创建语句:
CREATE INDEX idx_a_status ON A(status); CREATE INDEX idx_b_category ON B(category);
- 对于过滤条件
- 排序和聚合字段索引:
- 对于排序字段
COUNT(B.value)
,虽然不能直接针对聚合函数创建索引,但可以考虑对B.value
创建索引。因为在进行聚合操作时,数据库可能会利用B.value
索引来更快地计算聚合结果,并且在排序时,如果聚合结果是基于有索引的字段计算的,也可能间接利用索引来加速排序。 - 索引创建语句:
CREATE INDEX idx_b_value ON B(value);
- 对于排序字段
- 关联字段索引:
- 索引的验证与调整
- 使用
EXPLAIN
命令来查看查询的执行计划,观察索引是否被正确使用。例如:EXPLAIN SELECT A.id, COUNT(B.value), SUM(C.amount) FROM A JOIN B ON A.common_id = B.common_id JOIN C ON A.common_id = C.common_id WHERE A.status = 'active' AND B.category ='specific' GROUP BY A.id ORDER BY COUNT(B.value) DESC;
- 如果执行计划显示索引未被有效利用,需要进一步分析原因。可能是统计信息过时,需要使用
ANALYZE
命令更新表的统计信息;也可能是索引设计不合理,需要调整索引结构,比如考虑复合索引等。例如,如果A.status
和A.common_id
经常一起在查询条件中使用,可以考虑创建复合索引:CREATE INDEX idx_a_status_common_id ON A(status, common_id);
- 同时要注意索引并非越多越好,过多的索引会增加插入、更新和删除操作的开销,因为每次数据变动时,数据库都需要更新相关的索引。所以在优化查询性能的同时,要平衡对其他数据库操作的影响。
- 使用