【问题标题】:Does long query string affect the speed?长查询字符串会影响速度吗?
【发布时间】:2013-11-22 06:57:59
【问题描述】:

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

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

【问题讨论】:

  • 不知道速度,但你为什么不直接使用collegeid IN (1,2,3..)等。节省大量打字!
  • 请具体说明..需要考虑的因素很多:内存、dbms、joins、index Key....
  • @Andrew 我可以在 IN 中有 1000 个条目吗?
  • @Anirudh 是的,我正在处理连接

标签: mysql sql performance optimization


【解决方案1】:

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

类似这样的:

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

根据MYSQL

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

IN 列表中值的数量仅受 max_allowed_packet 值。

您也可以查看IN vs OR in the SQL WHERE ClauseMYSQL 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 倍

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

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

【讨论】:

  • 如果这些列被索引,则不会有任何性能提升。即使它们没有被索引,性能也不会有任何显着提升
  • @Anirudh:我认为这种说法并不普遍。即使您的 where 子句中有析取 / IN 子列表,某些 DBMS 也会使用索引。
  • @Rahul In 可以持有的 ID 是否有任何限制?
  • 我想说,在那个确切的例子中,'IN'关键字也不是最好的答案。我会使用 1 到 1000 之间
  • @user2894116:- 是的,您可以通过 max_allowed_pa​​cket 设置它:- dev.mysql.com/doc/refman/5.1/en/…
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    其实,字符串长度是没有问题的。 IN() 中有多少值更重要。

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

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

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

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

    【讨论】:

    • 我的 id 不会超过 20k 。会不会产生问题?
    • 这取决于您的硬件。 20k 不会是最近服务器的问题。但是你需要测试你自己的测试台
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-31
    • 2011-06-01
    • 1970-01-01
    • 2018-09-15
    相关资源
    最近更新 更多