主题
面试速答(先看这里)
**一句话结论:**我们介绍过,当进行联接查询时,MySQL 通常会选择较小的表作为驱动表,然后在较大的表中查找匹配的记录。
60秒标准回答:
我们介绍过,当进行联接查询时,MySQL 通常会选择较小的表作为驱动表,然后在较大的表中查找匹配的记录。这种策略的核心思想是减少扫描和比较的次数,从而提高查询性能
假设我们有两个表:employees(1000 条记录)和 departments(10 条记录),并且要进行以下查询
在不考虑hash join等其他链接方式,只考虑nested loop join的情况下,其实执行的次数是笛卡尔积,即
**答题顺序:**结论 → 原理/机制 → 关键流程 → 场景与取舍 → 易错点
回答主线:
- **要点1:**假设我们有两个表:employees(1000 条记录)和 departments(10 条记录),并且要进行以下查询:
- **要点2:**在不考虑hash join等其他链接方式,只考虑nested loop join的情况下,其实执行的次数是笛卡尔积,即:
- **要点3:**但是,假设employees.department_id和departments.id 都有索引的情况下,就不一样了,因为索引的查询是比较快的,他的复杂度是log(n)。
- **要点4:**大表驱动小表,复杂度为:O(1000) * O(log 10)
- **要点5:**小表驱动大表,复杂度为:O(10) * O(log 1000)
**记忆锚点:**log → MySQL → join → employeesdepartment_id → departmentsid → departments
关键取舍:
- 这种策略的核心思想是减少扫描和比较的次数,从而提高查询性能。
追问准备:
- 围绕「log」:底层原理是什么?使用时有哪些边界和常见坑?
- 围绕「MySQL」:底层原理是什么?使用时有哪些边界和常见坑?
- 围绕「join」:底层原理是什么?使用时有哪些边界和常见坑?
- 如果线上出现异常,你会如何定位、验证并规避?
典型回答
我们介绍过,当进行联接查询时,MySQL 通常会选择较小的表作为驱动表,然后在较大的表中查找匹配的记录。这种策略的核心思想是减少扫描和比较的次数,从而提高查询性能。
假设我们有两个表:employees(1000 条记录)和 departments(10 条记录),并且要进行以下查询:
java
SELECT e.name, d.department_name
FROM employees e
JOIN departments d ON e.department_id = d.id在不考虑hash join等其他链接方式,只考虑nested loop join的情况下,其实执行的次数是笛卡尔积,即:
java
for(1000){
for(10)
}
和
for(10){
for(1000)
}但是,假设employees.department_id和departments.id 都有索引的情况下,就不一样了,因为索引的查询是比较快的,他的复杂度是log(n)。那么:
大表驱动小表,复杂度为:O(1000) * O(log 10)
小表驱动大表,复杂度为:O(10) * O(log 1000)
这样一算的话,就非常清楚了,肯定是小表驱动大表的整体的复杂度更低!