无限循环查询:选择WHERE IN(选择不同的...)

时间:2015-06-09 21:12:28

标签: mysql

我想知道我的woltlab论坛中的其他人是否使用过相同的DISTINCT(软件规格)和#34; noname"。有数千个条目,表中有很多条目。所以我使用SELECT * FROM db_123456.wcf1_user_iplog WHERE userAgent IN (SELECT DISTINCT(userAgent) FROM db_123456.wcf1_user_iplog WHERE username = "noname" ) AND username != "noname"; 列出了noname的所有userAgent。这本身就可以。但我想检查具有相同userAgent的其他用户的条目。

test.txt
然而,这会导致无限循环。至少我认为它是一个,因为50k条目可能不会导致超过120秒的执行。 我用过:MySQL Workbench和phpMyAdmin。

为什么不终止?

我该怎么办?

2 个答案:

答案 0 :(得分:2)

MySQL通常会很好地优化WHERE IN,并且JOIN往往会做得更好。

SELECT a.*
FROM db_123456.wcf1_user_iplog AS a
JOIN (SELECT DISTINCT userAgent
      FROM db_123456.wcf1_user_iplog
      WHERE username = "noname") AS b
ON a.userAgent = b.userAgent
AND a.username != "noname"

BTW,DISTINCT不是函数,不需要在列名称周围加上括号。

答案 1 :(得分:0)

除非查询优化器将您的查询转换为连接(它应该,但是mysql可以密集),否则内部查询会创建一个巨大的临时表,并且根据可用的资源可能很难处理它......通常会这样做。 / p>

您可以通过编写表示为join的等效查询来帮助mysql:

SELECT DISTINCT t.*
FROM db_123456.wcf1_user_iplog t
JOIN db_123456.wcf1_user_iplog t2
  ON t2.userAgent = t.userAgent
  AND username = 'noname'
WHERE username != 'noname'

确保userAgent上有一个索引,以获得最佳效果。

此查询可能与Barmar相似,但我相信这会更好,因为:

  • 没有子查询
  • 用户名条件被推入连接条件(在连接期间评估,而不是在连接结果
  • 独特的运营商处于顶层