sql - 在超过 100 万行的表中什么更有效?交叉连接还是子查询?
问题描述
我需要创建一个视图来过滤仅在辅助表的 1 行中设置的日期范围:
aux_date_table
:
start_date end_date
------------------------
08/01/18 08/11/18
main_table
date subject
--------------------------
01/08/18 inoninoininoi
01/08/18 inoninoininoi
01/08/18 inoninoininoi
02/08/18 inoninoininoi
02/08/18 inoninoininoi
02/08/18 inoninoininoi
03/08/18 inoninoininoi
03/08/18 inoninoininoi
03/08/18 inoninoininoi
04/08/18 inoninoininoi
.
.
.
第一个选项是:
select main_table.*
from main_table, aux_date_table
where main_table.date between aux_date_table.start_date
and aux_date_table.end_date
第二种选择是:
select main_table.*
from main_table
where main_table.date between (select start_date from aux_date_table)
and (select end_date from aux_date_table)
哪个选项最有效?
解决方案
我会使用JOIN
而不是第一个选项或第二个选项,因为这样会更清楚你想要做什么。
select main_table.* from main_table
INNER JOIN aux_date_table
ON main_table.data between aux_date_table.start_date and aux_date_table.end_date
您的第一个选择是 CROSS JOIN 但旧样式。
我建议你使用CROSS JOIN
而不是,
select main_table.*
from main_table CROSS JOIN aux_date_table
where main_table.data between aux_date_table.start_date and aux_date_table.end_date
如果您想选择哪个更快,我会选择第一个选项。
因为第二个选项在performance
可能比第一个更糟的地方使用子查询。
推荐阅读
- javascript - 我无法从 firebase 数据库中获取数据
- php - 在分页期间保持 PHP/AJAX 过滤器选择
- node.js - 为什么 webpack 在运行 npm run dev 时会报错
- python - 从目录中检索一部分文件的奇怪问题:python中没有这样的文件或目录错误
- mysql - 如何在mysql中的两个日期之间获取几个月的持续时间?
- python - 调用函数时如何丢弃多余的参数?
- ios - 是否可以从最近删除的照片中恢复?
- python - 为什么我在 BeautifulSoup 文档中找不到任何关于 .text 或 content 方法的内容?
- python - Python:如何用直线替换圆内的曲线点?
- docker - NGINX 反向代理配置结构