表有大约800万行。 X有一个非唯一索引。
显示索引,它显示在表中,键名X上有一个非唯一索引,其中“seq_in_index”为1,排序规则A,基数7850780,sub_part为NULL,打包为NULL,index_type为BTREE。
但是,此查询可能需要5秒才能运行。 int的列表来自另一个系统,我不允许将它们存储在一个表中,因为它们代表了社交网络上的友谊。
是否有比大规模IN声明更快的方式?
答案 0 :(得分:12)
您可以将ID列表转换为临时表(如果MySql支持,则转换为table-var)并加入它。
该表只会与查询一样长,因此您实际上并未在表中存储任何内容。
答案 1 :(得分:5)
您可以尝试将它们存储在temporary table中。这个表不会永久存储在数据库中,我认为最终的连接(假设您也将索引临时表)会更快,因为它能够并行处理索引而不必进行索引查找对于IN子句中的每个int。当然,如果MySQL知道它将使用索引,那么它可能会优化IN子句并执行相同的操作,因此它实际上可能无法获得任何东西。我会尝试一下,看看它是否更快。
答案 2 :(得分:4)
正如其他人所建议的那样,临时表是最合适的解决方案。
请注意,根据基数和临时表/ in()条件中的行数,优化器可能仍然需要使用顺序扫描,因为顺序读取可能比许多更快随机寻找指数。
此时考虑重新设计关系可能是恰当的。