面试题答案
一键面试假设我们有一个employees
表,包含department
(部门)、salary
(薪资)和name
(姓名)字段,有以下不同查询场景:
- 仅基于
department
查询:
此时索引字段顺序为CREATE INDEX idx_department ON employees (department);
department
,因为查询仅依赖该字段,这样索引效率最高。 - 基于
department
和salary
查询,且department
过滤性强:
先列CREATE INDEX idx_department_salary ON employees (department, salary);
department
,因为它过滤性强,在查询时department
先筛选出较少的数据,再用salary
进一步筛选,能充分利用索引提高效率。例如查询select * from employees where department = 'HR' and salary > 5000;
,MySQL可以先通过department
定位到HR
部门员工,再用salary
筛选。 - 基于
salary
和department
查询,且salary
过滤性强:
这种情况下CREATE INDEX idx_salary_department ON employees (salary, department);
salary
过滤性强,先按salary
筛选,再用department
,能提高查询效率。如查询select * from employees where salary > 8000 and department = 'Engineering';
- 基于三个字段
department
、salary
和name
查询,department
过滤性最强,salary
次之:
按照过滤性从强到弱排序字段,查询如CREATE INDEX idx_department_salary_name ON employees (department, salary, name);
select * from employees where department = 'Finance' and salary > 6000 and name = 'John';
时,先通过department
筛选大量数据,再用salary
,最后name
,可达到最优查询性能。
总结来说,在创建联合B+树索引时,应将过滤性强(即能快速缩小结果集范围)的字段放在索引的前列,以提高查询性能。