代码之家  ›  专栏  ›  技术社区  ›  Bemmu

从表中选择x in(…几百int…)

  •  2
  • Bemmu  · 技术社区  · 16 年前

    表有大约800万行。X有一个非唯一索引。

    显示索引时,表中键名X上有一个非唯一索引,其中“seq_in_index”为1,排序规则A,基数7850780,子部分为空,压缩为空,索引类型为btree。

    不过,此查询可能需要5秒钟才能运行。Int的列表来自另一个系统,我不允许将它们存储在表中,因为它们代表社交网络上的友谊。

    有没有比大规模陈述更快的方法?

    3 回复  |  直到 16 年前
        1
  •  12
  •   shsteimer    16 年前

    您可以将ID列表转换为临时表(如果MySQL支持,则转换为表var)并与之连接。

    该表的有效期仅与查询的有效期相同,因此实际上 存储 桌子上的任何东西。

        2
  •  5
  •   tvanfosson    16 年前

    您可以尝试将它们存储在 temporary table .这个表不会永久地存储在数据库中,我认为结果连接(假设您也为临时表编制索引)会更快,因为它能够并行处理索引,而不必为in子句中的每个in t进行索引查找。当然,如果MySQL知道它将使用一个索引,那么它可能会优化in子句并做同样的事情,这样它就不会真正获得任何东西。不过,我还是会试试看速度是否更快。

        3
  •  4
  •   Jan Jungnickel    16 年前

    正如其他人所建议的,临时表是最合适的解决方案。

    但是要注意,根据基数和临时表/in()条件中的行数,优化器可能仍然使用顺序扫描,因为顺序读取比索引中的许多随机查找快得多。

    此时考虑重新设计关系可能是合适的。