首页 > 解决方案 > mysql内部连接和在哪里

问题描述

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;

标签: mysqlsql

解决方案


在第二个中,您正在预过滤然后加入。这打破了索引。您基本上是在返回一个没有索引的要加入的新表。

如果您查看查询说明计划,您应该会看到 n2 中的连接。没有索引查找。

如果您想检查是什么让您放慢速度以使用查询解释计划并学习阅读它在做什么,这通常是一个好主意。


推荐阅读