Mysql 对1000个不同的值使用IN子句是否有效?
在我的Java程序中,我需要从MySQL数据库中选择1000行,每行使用不同的Mysql 对1000个不同的值使用IN子句是否有效?,mysql,sql,select,Mysql,Sql,Select,在我的Java程序中,我需要从MySQL数据库中选择1000行,每行使用不同的WHERE条件。必须通过一个查询检索这些行。为此,我在子句中使用了,如下所示: SELECT * FROM t WHERE (columnA,columnB) IN ((valA1,valB1),(valA2,valB2),(valA3,valB3),...) 它搜索columnA=valA1和columnB=valB1或columnA=valA2和columnB=valB2的行,依此类推 这种方法适用于1000行(
WHERE
条件。必须通过一个查询检索这些行。为此,我在子句中使用了,如下所示:
SELECT * FROM t WHERE (columnA,columnB) IN ((valA1,valB1),(valA2,valB2),(valA3,valB3),...)
它搜索columnA=valA1和columnB=valB1
或columnA=valA2和columnB=valB2
的行,依此类推
这种方法适用于1000行(意味着1000对(valA,valB))有效吗?我一直在寻找一种有效的批量选择方法,到目前为止,我已经找到了这种方法。这种方法有效吗?这取决于你在问题中没有解释的因素
但是。如果在(columnA,columnB)
上有一个索引,并且in
子句中的中的所有值都是常量,那么。这是MySQL 8+中提供的新功能
MySQL在
列表中对中的常量值进行了另一次优化。它对它们进行排序并使用二进制搜索。仍然需要进行表扫描,但二进制搜索使比较速度更快。我不知道MySQL是否已经扩展到处理元组和常量。鉴于人们越来越关注元组优化,如果MySQL也进行这种优化,我也不会感到惊讶。找到答案的最佳方法是创建一些随机测试数据并进行尝试。如果它对您的用例足够有效,那么您就可以了——否则您可以使用相同的测试数据来尝试其他方法并优化查询。@AndreasFester谢谢您的回答。但我认为你的评论在stackoverflow社区里没有意义。我们在这里分享我们的经验,否则我们可以为每个问题投入大量的时间,并自己找到最终的答案!也许将这个条件数组存储在临时引擎=内存索引表中会有所改进。@soheil这就是我所做的-分享我的经验。如果我们不知道任何指标,我们如何知道您的方法是否足够“有效”?根据您的用例,运行两小时的查询可能仍然可以,而另一个用例可能要求查询只需要几毫秒。我删除了java和jdbc标记,因为您的问题似乎仅限于MySQL