我想知道我的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。
为什么不终止?
我该怎么办?
答案 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相似,但我相信这会更好,因为: