Mysql 从ID列表中选择数千行的最有效方法

Mysql 从ID列表中选择数千行的最有效方法,mysql,Mysql,是否有任何可伸缩的方法可以使用mysql或类似的工具选择数千行 例如 这是可能的还是我只是在做梦?架构是InnoDB,如果另一个架构提供更具可扩展性的解决方案,则可以对其进行更改 作为参考,我从Solr返回的一组ID中获取搜索结果。我希望使用mysql进行最终检索,因为它将使这些结果的排序和最终过滤更加容易(我不会详细说明原因) 编辑: 只要IN仍然包含所有100000个ID,查询就可以使用LIMIT子句 例如 我就是我,并不真正了解您的框架,您应该尝试将这些ID插入到一个临时表中,并通过一个简

是否有任何可伸缩的方法可以使用mysql或类似的工具选择数千行

例如

这是可能的还是我只是在做梦?架构是InnoDB,如果另一个架构提供更具可扩展性的解决方案,则可以对其进行更改

作为参考,我从Solr返回的一组ID中获取搜索结果。我希望使用mysql进行最终检索,因为它将使这些结果的排序和最终过滤更加容易(我不会详细说明原因)

编辑:

只要IN仍然包含所有100000个ID,查询就可以使用LIMIT子句

例如


我就是我,并不真正了解您的框架,您应该尝试将这些ID插入到一个临时表中,并通过一个简单的内部联接使用这个表。事实证明,这可能与中的速度一样快。

我在插入mysql表时遇到了相同的问题。 可能的查询大小取决于您的mysql配置

我的方法是将大型ids集合分为几个部分

使用Ruby on Rails:

all_ids.each_slice(10000) do |ids_part|
  query = "INSERT INTO ..."
end

也许这也是一种按ID选择行的解决方案。

如果您想获得性能,最好使用solr的排序。您真的必须获取所有千行的实际内容吗?你不能先进行分页算法,然后开始每页取数吗?@cherouvim他需要进行排序。这就是为什么他选择了我假设的所有记录。@sathis。本例中的排序基于另一个表。将所有这些整合到solr中并不是我现在想要解决的问题,因为它可能需要相当长的时间,我不确定它是否真的能更有效。想想看。您必须将所有ID传输到mysql(一个简单的逗号分隔列表非常紧凑),mysql必须处理该列表。也许准备好的语句会有帮助(正确的,而不是软件模拟的),因为ID可以作为二进制列表发送-节省mysql一点文本解析)-但最终还是认为你做得不对。如果您不能在solr上进行最终排序和筛选,请改为其他方式!我考虑过这一点,但是在为可能数十万个ID调用INSERT时,写入开销是否会超过从内部联接中获得的任何好处?更重要的是,单个SQL查询的大小(以字符为单位)通常有一个上限。一个长的
IN()
列表是达到这个极限的好方法。使用临时表可以避免这种情况。此外,如果您需要多次使用列表,临时表解决方案可能会更有效。如果是搜索,可能会出现这种情况,因为您可能希望对结果进行分页。我在一个相对较大的表上尝试了它,虽然在中完成大约需要一分钟,但内部连接在不到100毫秒的时间内完成。
SELECT * FROM awesomeTable WHERE id IN (1,2,3,4......100000) LIMIT 10;
all_ids.each_slice(10000) do |ids_part|
  query = "INSERT INTO ..."
end