长查询字符串会影响速度吗?

时间:2013-11-10 13:03:09

标签: mysql sql performance optimization

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

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

3 个答案:

答案 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秒

IN比OR

快3倍
  

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

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

答案 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 ...