我有一个场景,我需要针对一个包含约60,000个名称记录的表检查10,000个不同的特定名称。假设缓存不相关,一般来说,出于性能目的,最好是:
(1)分解为迷你查询,以便每个查询可能有200个不同的名称?
或
(2)用10,000个“OR”子句写一个含糊的sql语句?
答案 0 :(得分:7)
你错过了第3名:完全是另一种方式:
我会将列表写入单独的表/临时表或其他内容,然后使用join
/ exists
或其他任何内容进行过滤。
答案 1 :(得分:1)
第一个观察结果是,通常RDBMS对查询字符串的大小有限制,你可能会超过这么多的OR。
因此,解决方案是编写存储过程并在循环中执行。
忽略这一点,假设在情况(1)中,数据将被访问的次数多于情况(2),则后者是优选的。
答案 2 :(得分:1)
或#4 - 批量使用IN()查询。大约1000通常很好用:
SELECT * FROM table WHERE name IN('str1','str2','str3',...)
它并不完美,但没有临时表,MySQL非常适合优化IN()。