面试题答案
一键面试- 表的统计信息
- 数据量:优化器会参考表中记录的数量。例如,有一个
orders
表记录了大量订单数据,如果查询SELECT * FROM orders WHERE order_date > '2023 - 01 - 01'
,优化器知道表数据量巨大,会倾向于选择能快速过滤数据的执行计划。如果在order_date
列上有索引,优化器可能会选择使用该索引快速定位符合条件的记录,而不是全表扫描。 - 列的基数:即列中不同值的数量。比如
users
表的gender
列,只有male
和female
两个值,基数低。在SELECT * FROM users WHERE gender ='male'
查询中,优化器可能认为即使没有索引,全表扫描成本也不高,因为不同值少,扫描行数不会太多。而对于email
列,基数高,每个用户的邮箱几乎不同,若有索引,优化器更可能利用索引快速定位。
- 数据量:优化器会参考表中记录的数量。例如,有一个
- 索引情况
- 索引类型:常见的有B - Tree索引、哈希索引等。B - Tree索引适合范围查询,如
SELECT * FROM products WHERE price BETWEEN 10 AND 100
,如果price
列上是B - Tree索引,优化器会利用它快速定位价格区间内的记录。哈希索引适合等值查询,例如SELECT * FROM employees WHERE employee_id = 123
,若employee_id
列是哈希索引,优化器可能选择使用哈希索引快速找到对应员工记录。 - 复合索引:假设有一个复合索引
(col1, col2, col3)
,在查询SELECT * FROM table_name WHERE col1 = 'value1' AND col2 = 'value2'
时,优化器会利用复合索引从左到右的顺序匹配,优先根据col1
过滤,再根据col2
进一步过滤,提高查询效率。但如果查询是SELECT * FROM table_name WHERE col2 = 'value2'
,由于复合索引最左前缀原则,优化器可能不会使用该复合索引,而选择其他策略(如果有其他合适索引或进行全表扫描)。
- 索引类型:常见的有B - Tree索引、哈希索引等。B - Tree索引适合范围查询,如
- 查询条件
- 比较运算符:对于
=
、>
、<
等运算符,优化器处理方式不同。例如SELECT * FROM students WHERE age > 18
,优化器会考虑是否有适合>
运算的索引(如B - Tree索引)来快速定位大于18岁的学生记录。如果是SELECT * FROM students WHERE age = 20
,哈希索引或B - Tree索引都可能被优化器考虑用于快速定位。 - 逻辑运算符:像
AND
、OR
。在SELECT * FROM products WHERE category = 'electronics' AND price < 500
中,优化器会结合category
和price
列的索引情况来制定执行计划,尽可能利用索引先过滤出电子产品,再从电子产品中筛选价格小于500的产品。而对于SELECT * FROM products WHERE category = 'electronics' OR category = 'clothes'
,优化器要权衡是分别使用category
索引查找电子产品和服装产品,还是进行全表扫描。
- 比较运算符:对于
- 关联方式
- 嵌套循环连接(Nested - Loop Join):如果两个表
A
和B
连接,当表A
数据量小,表B
数据量很大且表B
在连接列上有索引时,优化器可能选择嵌套循环连接。例如,A
表是departments
(记录部门信息,数据量小),B
表是employees
(记录员工信息,数据量很大),连接条件是departments.department_id = employees.department_id
,且employees
表的department_id
列有索引,优化器可能对departments
表每一条记录,利用索引在employees
表中查找匹配记录。 - 哈希连接(Hash Join):当两个表数据量都较大时,优化器可能选择哈希连接。比如有两个大表
orders
和order_items
,连接条件是orders.order_id = order_items.order_id
,优化器可能先在内存中对其中一个表(如orders
表)根据连接列order_id
构建哈希表,然后扫描另一个表order_items
,利用哈希表快速找到匹配的订单记录。 - 排序合并连接(Sort - Merge Join):如果两个表在连接列上已经排序,优化器可能选择排序合并连接。假设
table1
和table2
在连接列id
上都已排序,优化器可以通过顺序扫描两个表,按顺序匹配id
值来完成连接操作。
- 嵌套循环连接(Nested - Loop Join):如果两个表