假设我有一个很长的查询字符串,例如。
SELECT id from users where collegeid='1' or collegeid='2' . . . collegeid='1000'
会以任何方式影响速度或输出吗?
SELECT m.id,m.message,m.postby,m.tstamp,m.type,m.category,u.name,u.img
from messages m
join users u on m.postby=u.uid
where m.cid = '1' or m.cid = '1' . . . . . .
or m.cid = '1000'. . . .
答案 0 :(得分:4)
我希望在这种情况下使用IN
,因为它会更好。但是,要检查性能,您可以尝试查看正在执行的查询的执行计划。您将了解使用两者的性能差异。
这样的事情:
SELECT id from users where collegeid IN ('1','2','3'....,'1000')
根据MYSQL
如果所有值都是常量,则根据类型评估它们 expr和排序。然后使用a完成对项目的搜索 二分搜索。 这意味着如果IN值列表IN非常快 完全由常数组成。
IN列表中的值数量仅受限于 max_allowed_packet 值。
您还可以查看IN vs OR in the SQL WHERE Clause和 MYSQL OR vs IN performance
Ergec给出的答案非常有用:
SELECT * FROM item WHERE id = 1 OR id = 2 ... id = 10000
此查询 0.1239秒
SELECT * FROM item WHERE id IN (1,2,3,...10000)
此查询 0.0433秒
会以任何方式影响速度或输出吗?
所以答案是是,性能会受到影响。
答案 1 :(得分:2)
显然,查询字符串的长度与其处理时间之间没有直接关联(因为一些非常短的查询可能非常复杂,反之亦然)。对于您的具体示例:它取决于查询的处理方式。您可以通过查看查询执行计划来检查这些内容(语法取决于您的DBMS,例如EXPLAIN PLAN)。如果DBMS必须执行全表扫描,性能只会受到轻微影响,因为DBMS无论如何都必须访问构成表的所有页面。如果在collegeid上有一个索引,那么你在析取中输入的条目可能会越多,因为会有几个(尽管非常快)的索引查找。在某些时候,我们将进行完整的索引扫描而不是单独的查找,此时性能将不再显着降低。
但是 - 细节取决于我们的DBMS及其执行计划。
答案 2 :(得分:2)
我不确定你是否面对我所遭受的痛苦。
实际上,字符串长度不是问题。 IN()中有多少个值更重要。
我已经测试了IN()中可以列出的元素数量。 结果是可以处理10,000个元素而不会丢失性能。
IN()中的值应存储在某处并在查询评估时进行搜索。但是10k的值越来越慢了。
因此,如果您有多个100k值,则拆分10个组并尝试10次查询。或者保存在临时表和JOIN中。
并且长查询使用更多CPU,因此IN()优于column = 1 OR ...