MST

星途 面试题库

面试题:MySQL查询执行引擎中优化器如何选择执行计划

请阐述MySQL查询执行引擎里优化器在选择执行计划时,主要会考虑哪些因素,比如表的统计信息、索引情况等方面,简单举例说明。
31.4万 热度难度
数据库MySQL

知识考点

AI 面试

面试题答案

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