6

假设我有一个长查询字符串,例如。

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'. . . . 
4

3 回答 3

4

我更喜欢IN在这种情况下使用,因为它会更好。但是,要检查性能,您可以尝试查看正在执行的查询的执行计划。您将了解使用两者将获得什么样的性能差异。

像这样的东西:

SELECT id from users where collegeid IN ('1','2','3'....,'1000')

根据MYSQL

如果所有值都是常量,则根据 expr 的类型对它们进行评估并排序。然后使用二进制搜索完成对项目的搜索。这意味着如果 IN 值列表完全由常量组成,则 IN 非常快。

IN 列表中值的数量仅受 max_allowed_pa​​cket值的限制。

您还可以检查SQL WHERE 子句中的 IN vs ORMYSQL OR vs IN 性能

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 秒

IN 比 OR 快 3 倍

它会以任何方式影响速度或输出吗?

所以答案是肯定的,性能会受到影响。

于 2013-11-10T13:06:25.443 回答
2

显然,查询字符串的长度与其处理时间之间没有直接关联(因为一些非常短的查询可能非常复杂,反之亦然)。对于您的具体示例:这取决于查询的处理方式。您可以通过查看查询执行计划来检查这一点(语法取决于您的 DBMS,例如 EXPLAIN PLAN)。如果 DBMS 必须执行全表扫描,性能只会受到轻微影响,因为无论如何 DBMS 必须访问构成表的所有页面。如果在collegeid 上有一个索引,那么您在析取中输入的条目越多,性能可能会受到越多的影响,因为会有几个(尽管非常快)索引查找。在某个时候,我们将进行全索引扫描,而不是单独查找,此时性能不会再显着下降。

但是 - 细节取决于我们的 DBMS 及其执行计划器。

于 2013-11-10T13:11:46.043 回答
2

我不确定你是否正面临我所遭受的痛苦。

实际上,字符串长度不是问题。IN() 中有多少值更重要。

我已经测试了可以在 IN() 中列出多少个元素。结果是可以处理 10,000 个元素而不会损失性能。

IN() 中的值应存储在某处并在查询评估时进行搜索。但是 10k 值越来越慢。

因此,如果您有许多 100k 值,请拆分 10 个组并尝试 10 次查询。或保存在临时表中并加入。

并且长查询使用更多的 CPU,所以 IN() 比 column = 1 OR ...

于 2013-11-10T13:31:35.430 回答