MySQL 查询返回无效行并且非常慢

标签 mysql sql performance

我正在编写一个查询以从另一个表中选择玩家禁令,但首先它非常慢,大约需要 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/

相关文章:

c++ - boost 线程互斥数组

php - 如何通过PHP从MySQL db获取数据并输出为JSON,然后在JQuery中跨域ajax请求数据

mysql - 在 MySQL 中将 2 和 2 值组合在一起

mysql - 你的 SQL 语法有错误 ...near '' '

java - 没有从数据库中删除的消息对话框

MySQL并不总是使用索引

php - 子查询问题,使用 "AS"和 "AND"时返回SQL错误

mysql - 如果 sql 计数为 NULL,则显示零

python - 如何强制 Postgresql 使用任何 SQL 语句为丢失的数据返回 None?

c# - 正则表达式性能下降