Mysql 运行该查询
Mysql 运行该查询,mysql,Mysql,运行该查询
运行该查询另一个需要考虑的是,在你的风格中,与连接相比,未来的优化几乎是不可能的。通过连接,您可能会添加一个索引,谁知道呢,它取决于数据集,它可能会将速度提高2、5、10倍。使用IN,它将运行该查询 我可能错了,但子查询很重。因此,如果使用
JOIN
和ON
子句执行它,速度会更快,因为它不会检索子选择的所有结果。在第二个查询中,您首先检索子选择的所有结果,然后查看它。我可能错了,但子查询非常繁重。因此,如果使用JOIN
和ON
子句执行它,速度会更快,因为它不会检索子选择的所有结果。在第二个查询中,首先检索子选择的所有结果,然后查看。谢谢,我在问题中添加了EXPLAIN
。我对这种查询计划不太熟悉,但显然它们完全不同。谢谢,我在问题中添加了EXPLAIN
。我对这种查询计划不太熟悉,但显然它们完全不同。谢谢,我添加了查询的解释,但我在阅读时遇到了一些困难!谢谢,我添加了查询的解释,但是我在阅读时遇到了一些麻烦!谢谢,所有的事情都指向支持JOIN
,但我仍然对差异的大小感到困惑。考虑到Aaron Miller对我的one-IN子句的回答根本不使用索引,正如我所说的,只是在表中循环检查每一行是否匹配IN-cluase的值集;而JOIN首先构建临时表(并且您正在使用该联接的索引,对吗?),然后获取行。这样,遍历500万行将花费大量时间(实际上,这取决于一些数据库设置和环境)。希望这能有所帮助。谢谢,所有的事情都指向支持JOIN
,但我仍然对差异的大小感到困惑。考虑到Aaron Miller对我的一个IN子句的回答根本不使用索引,正如我所说的,只是在表中循环检查每一行是否匹配IN-cluase的值集;而JOIN首先构建临时表(并且您正在使用该联接的索引,对吗?),然后获取行。这样,遍历500万行将花费大量时间(实际上,这取决于一些数据库设置和环境)。希望有帮助。
SELECT DISTINCT (date_time)
FROM my_table
JOIN (SELECT DISTINCT (DATE_ADD( date_time, INTERVAL 1 HOUR)) date_offset
FROM my_table) offset_dates
ON date_time = date_offset
SELECT DISTINCT(date_time)
FROM my_table
WHERE date_time IN (SELECT DISTINCT(DATE_ADD(date_time, INTERVAL 1 HOUR))
FROM my_table)
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY <derived2> ALL NULL NULL NULL NULL 1710 Using temporary
1 PRIMARY my_table ref PRIMARY PRIMARY 8 offset_dates.date_offset 555 Using index
2 DERIVED my_table index NULL PRIMARY 13 NULL 5644204 Using index; Using temporary
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY my_table range NULL PRIMARY 8 NULL 9244 Using where; Using index for group-by
2 DEPENDENT SUBQUERY my_table index NULL PRIMARY 13 NULL 5129983 Using where; Using index; Using temporary