Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用“快速选择所有行”;1个或多个“;匹配另一个表中的行_Sql_Mysql_Query Optimization - Fatal编程技术网

Sql 使用“快速选择所有行”;1个或多个“;匹配另一个表中的行

Sql 使用“快速选择所有行”;1个或多个“;匹配另一个表中的行,sql,mysql,query-optimization,Sql,Mysql,Query Optimization,我希望以最有效的方式从一个表中选择与另一个表中的“一个或多个”行匹配的所有行 SELECT identity.id FROM identity INNER JOIN task ON task.identityid=identity.id AND task.groupid IN (78, 122, 345, 12, 234, 778, 233, 123, 33) 当前,如果有多个匹配任务,则会多次返回相同的标识(但以后删除这些任务的性能损失也不算太大)。我希望它只为每个标识返回一行,与一

我希望以最有效的方式从一个表中选择与另一个表中的“一个或多个”行匹配的所有行

SELECT identity.id FROM identity
INNER JOIN task ON
  task.identityid=identity.id
  AND task.groupid IN (78, 122, 345, 12, 234, 778, 233, 123, 33)
当前,如果有多个匹配任务,则会多次返回相同的标识(但以后删除这些任务的性能损失也不算太大)。我希望它只为每个标识返回一行,与一个或多个任务组相匹配,我想知道是否有比使用DISTINCT或GROUP BY更有效的方法

执行DISTINCT或GROUP BY的问题在于,任务表仍然会扫描所有的groupid匹配项,然后通过临时表(有时使用filesort)将它们缩减为一个。我宁愿它做一些短路评估——在找到一个身份后,不要再为同一身份进行任何后续任务匹配


我想做一个EXISTS子查询,但我不知道这些子查询是如何优化的。我需要让它先加入任务表,然后再加入标识表,所以我没有对标识表进行完整扫描,因为标识表非常大,并且会有很多不匹配项。

MYSQL支持TOP N语法吗?如果是:

SELECT TOP 1 identity.id FROM identity
INNER JOIN task ON
  task.identityid=identity.id
  AND task.groupid IN (78, 122, 345, 12, 234, 778, 233, 123, 33)

MYSQL支持Topn语法吗?如果是:

SELECT TOP 1 identity.id FROM identity
INNER JOIN task ON
  task.identityid=identity.id
  AND task.groupid IN (78, 122, 345, 12, 234, 778, 233, 123, 33)

在mysql中,只需使用“selectdistinct”就可以了。您可能需要将您的值放在一个表中并连接到它,而不是使用“in(…)”

在mysql中仅使用“SELECT DISTINCT”应该是有效的。您可能需要将您的值放入表中并连接到表中,而不是使用“in(…)”。

只要对子查询中比较的列进行了索引,Exists就可以正常运行


我希望exists的性能会比join和groupby稍微好一点,但我必须尝试一下才能确定。我在MySQL中遇到了足够多的性能方面的东西,我的预测是错误的,我知道值得尝试一下。

只要子查询中比较的列被索引,Exists对您的性能应该很好


我希望exists的性能会比join和groupby稍微好一点,但我必须尝试一下才能确定。我在MySQL中遇到了足够多的性能问题,我的预测是错误的,我知道值得尝试一下。

当我使用“DISTINCT”时,它显示“使用临时表”。对于我的简化测试来说,它似乎仍然相当快,但这是否增加了相当多的开销,可能会赶上我?不同的临时表是否在内存中一直保持快速?请注意更改。Mysql确实喜欢做临时表,但通常效率相当高。WHERE-EXISTS策略通常是最常见的跨服务器推荐,也应该有效。(WHERE…IN(…)让我不寒而栗-它通常意味着自动联合。)当我使用“DISTINCT”时,它显示“usingtemporary table”。对于我的简化测试来说,它似乎仍然相当快,但这是否增加了相当多的开销,可能会赶上我?不同的临时表是否在内存中一直保持快速?请注意更改。Mysql确实喜欢做临时表,但通常效率相当高。WHERE-EXISTS策略通常是最常见的跨服务器推荐,也应该有效。(其中,…IN(…)让我不寒而栗-它通常意味着自动联合。)mysql语法(而不是SELECT后面的TOP 1)是在查询末尾添加ORDER BY identity.id DESC LIMIT 1-但是TOP或LIMIT都会生成一行答案,这似乎与问题要求的答案完全不同。mysql语法(而不是选择后的TOP 1)将在查询结束时添加ORDER BY identity.id DESC LIMIT 1-但TOP或LIMIT生成的单行答案似乎与问题请求的答案大不相同。您可以通过提供(groupid,identityid)上的索引来优化任务表扫描--考虑到我在mysql中的WHERE EXISTS或其他子查询的性能体验,这似乎是一种更有前途的方法(如果子查询的优化在6.0中发生了革命性的变化,请有人告诉我,我将打破泡沫!-)是的,我的任务表上的主查询已经是这样了(每个任务组一个任务,每个标识一个任务),因此非常有效。您可以通过在(groupid,identityid)上提供索引来优化任务表扫描——鉴于我在mysql中WHERE EXISTS或其他子查询的性能体验,这似乎是一种更有希望的方法(如果子查询的优化在6.0中发生了革命性的变化,请有人告诉我,我会打破泡沫!-)是的,我的任务表上的主任务已经是这样了(每个任务组每个标识一个任务),所以它非常有效。我尝试了一下,解释表明它在任务表之前加入了标识表,因此它对标识表中的每一行执行子查询。这不是我想要的顺序,但很难说这是否仅仅是因为我拥有的测试数据太小-也许它会以另一种方式加入它,并使用大量的数据重新标识。我必须使用大量数据进行测试才能找到答案!我想我可能还误解了EXPLAIN如何显示子查询的联接顺序…我尝试了一下,EXPLAIN显示它在任务表之前联接了标识表,因此它对标识表中的每一行执行子查询。这不是我想要的顺序,但是很难说这是否仅仅是因为我拥有的测试数据太小了——也许它会以另一种方式以更多的身份连接它。我必须用大量数据进行测试才能找到答案!我想我可能还误解了EXPLAIN如何显示子查询的连接顺序。。。