我正在编写一个查询以从另一个表中选择玩家禁令,但首先它非常慢,大约需要 7-14 秒,其次它返回无效行。
第一个查询如下:
SELECT *
FROM sourcebans.sb_bans
WHERE removetype IS NULL
AND removedon IS NULL
AND reason NOT LIKE '%[FragSleuth] Duplicate account%'
AND ip IN(SELECT DISTINCT ip
FROM fragsleuth.history
WHERE trackingid = "ad000c3803b48190aabf382e01b957c9")
OR authid IN(SELECT DISTINCT steamid
FROM fragsleuth.history
WHERE trackingid = "ad000c3803b48190aabf382e01b957c9")
第二个查询如下
SELECT * FROM `history` WHERE trackingid = "ad000c3803b48190aabf382e01b957c9"
还有几张截图来说明我的意思: First Query Second Query
在屏幕截图 1 中,当我要求查询仅返回具有 NULL 的行时,您可以看到它返回了 removedon 和 removetype 不为空的行。
我也担心在历史表中,steamid 和 ip 列会有重复的条目,这可能会使查询变慢,有什么办法可以让查询只选择具有唯一 ip 或 steamid 的行基于跟踪 ID?
如有任何帮助,我们将不胜感激。
谢谢
编辑:我对帮助不知所措,感谢@maraca、@Skorpioh 和@Adam Silenko,查询时间现在不到一秒!
最佳答案
the and 具有更高的优先级 then or... 你需要在你的表上建立索引 np.如果您没有,请将索引添加到 fragsleuth.history 中的 trackingid 字段
使用一个子查询可能会更快,但我不确定这一点。
SELECT *
FROM sourcebans.sb_bans
WHERE removetype IS NULL
AND removedon IS NULL
AND reason NOT LIKE '%[FragSleuth] Duplicate account%'
AND exists (
SELECT 1 from fragsleuth.history
WHERE trackingid = "ad000c3803b48190aabf382e01b957c9"
and (ip = sourcebans.ip or steamid = sourcebans.authid) )
关于MySQL 查询返回无效行并且非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36120917/