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