【发布时间】:2020-11-13 21:51:12
【问题描述】:
2 个表:以employee & employee_address 为例
提供了三个索引:
ALTER TABLE employee ADD INDEX `E_P` (`position`) USING BTREE;
ALTER TABLE employee_address ADD INDEX `EA_Z` (`zipcode`) USING BTREE;
ALTER TABLE employee_address ADD INDEX `EA_E` (`employee_id`) USING BTREE;
第一个内部连接
select * from employee_address ea
inner join employee e on e.employee_id = ea.employee_id and e.position = 'MANAGER'
where ea.zipcode > 30000
使用 where 子句的第二次内连接
select * from employee_address ea
inner join (
select * from employee e where e.position = 'MANAGER'
) e on e.employee_id = ea.employee_id
where ea.zipcode > 30000
假设有: 每张表有 500000 条记录 1000个不同的位置 2000个不同的邮政编码
我发现查询 1 效率更高。
这两个查询有什么不同?
是否可以像在一张表中一样快速查询它? 以及如何?
select * from employee e where e.position = 'MANAGER'
and e.zipcode > 30000
ALTER TABLE employee ADD INDEX `Z_P` (`zipcode`, `position`) USING BTREE;
【问题讨论】:
-
使用
EXPLAIN查看不同的查询计划。 -
你应该在选择之前显示解释计划输出使用解释来获得输出。
-
@flyshell 。 . . MySQL 倾向于在
FROM子句中实现子查询,这限制了这些表上索引的使用。 -
explain 已经过检查,但是我找不到与查询 3 的性能相匹配的解决方案