mysql - 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;
解决方案
在第二个中,您正在预过滤然后加入。这打破了索引。您基本上是在返回一个没有索引的要加入的新表。
如果您查看查询说明计划,您应该会看到 n2 中的连接。没有索引查找。
如果您想检查是什么让您放慢速度以使用查询解释计划并学习阅读它在做什么,这通常是一个好主意。
推荐阅读
- android - 如何在android中的相对布局内设置文本视图与父文本视图对齐?
- rapidminer - 是否有某种方法可以导入由多行组成的数据?
- excel - Excel VBA 从受密码保护的访问数据库中查询
- android - 拖放组件在 android studio 的预览中不可见
- javascript - 获取对象内所有数组的二维数组
- ios - 如何使用通知和访问 userInfo?
- javascript - Jquery clone() 函数不能与 toggleClass() 一起使用。试图克隆图像但图像从当前位置移动
- discord.py - 如何使用 client.get_all_emojis() discord.py
- android - 检查谷歌地图内的多边形是否“有效”
- python - 在 Spyder 中导入 pandas 错误