mysql - 更高效的内连接查询

标签 mysql sql

是否可以使此查询更高效?

SELECT DISTINCT(static.template.name) 
FROM probedata.probe 
INNER JOIN static.template ON probedata.probe.template_fk = static.template.pk 
WHERE creation_time >=  DATE_SUB(NOW(), INTERVAL 6 MONTH)

谢谢。

最佳答案

首先,我将使用表别名重写它,以便我可以读取它:

SELECT DISTINCT(t.name) 
FROM probedata.probe p INNER JOIN
     static.template t
     ON p.template_fk = t.pk 
WHERE creation_time >=  DATE_SUB(NOW(), INTERVAL 6 MONTH);

让我做两个假设:

  • namestatic.template
  • 中是唯一的
  • creation_time 来自probe

第一个假设特别有用。您可以将查询重写为:

SELECT t.name
FROM static.template t
WHERE EXISTS (SELECT 1
              FROM probedata.probe p  
              WHERE p.template_fk = t.pk AND
                    p.creation_time >=  DATE_SUB(NOW(), INTERVAL 6 MONTH)
             );

第二个假设只影响索引。对于此查询,您需要在 probe(template_fk, creation_time) 上建立索引。

如果 template 有宽记录,那么 template(pk, name) 上的索引也可能有用。

这会将执行计划更改为扫描模板表,并使用 probe 表中的索引进行快速查找。不会有额外的处理来删除重复项。

关于mysql - 更高效的内连接查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36550119/

相关文章:

java - 如何从 unix 时间戳中提取小时数?

sql - 表中的最后一个 id 值。数据库服务器

php - 在 php 中创建搜索 - 输入城市并获取下面列出的该城市的景点

mysql - mysql 查询中 UNION SELECT 的组合 WHERE 子句

java - JDBC - NetBeans x MySQL

mysql - 使用选择和分组依据插入

sql - 比较多个日期范围

sql - 如何在 Ruby on Rails 迁移中使用 'gaps' 修复列的​​顺序

java - SQL中使用的本地日期java 8

mysql - 如何选择数据并为每个分组的选定值仅执行一次函数