【问题标题】:How to filter a similar field in multiple joined table如何过滤多个连接表中的相似字段
【发布时间】:2017-05-11 16:48:38
【问题描述】:

我的查询现在运行良好,但我担心可扩展性和性能。

此查询用于在表 t2 和 t3 中搜索单词,并返回与 t1 匹配的过滤结果。 t1 是多对多表。

目标: 我有 3 个表,用户 (user_id) 可以在其中插入记录。如果 user_id 有恶意并在 3 个表格中的任何一个中创建不适当的内容,我希望能够快速过滤他的内容。当我使用 innoDB 时,我可以立即删除从用户表创建的 user_id 的所有内容,但我想跟踪 user_id 的行为以供以后进一步分析。

情况

  • 我在三个连接表t1t2t3 中有一个类似的字段user_id
  • 我在t2t3 的任何表中搜索一个词(src_wd)。
  • 如果src_wordt2t3 中,则从t1 返回结果,即t2.id
  • 如果是邪恶用户,我设置用户为user.is_active = 0

table t1的外观:

|t1.id|t1.user_id|t2.id|t3.id| | 2 | 158 | 20 | 32 | | 3 | 165 | 20 | 34 | | 4 | 199 | 24 | 36 |

我当前的查询

SELECT DISTINCT t2.id

FROM t1

LEFT JOIN t2 ON t2.user_id = t1.user_id 
INNER JOIN t3 ON t3.user_id = t1.user_id 

LEFT JOIN user u1 ON u1.user_id = t1.user_id
LEFT JOIN user u2 ON u2.user_id = t2.user_id
LEFT JOIN user u3 ON u3.user_id = t3.user_id

WHERE 
u1.is_active != 0 AND u2.is_active != 0 AND u3.is_active != 0 
AND
t2.srcField LIKE '%$src_wd%' OR t3.srcField LIKE '%$src_wd%'

我的担心

我担心的是user 表上的多个联接 u1 u2 u3 我这样做是为了得到我想要的结果。

我可以稍后进行优化,但我正在学习,所以为什么不从现在开始尝试这种好方法。谢谢

【问题讨论】:

    标签: mysql join optimization innodb


    【解决方案1】:

    多个问题:

    • LIKE '%...'(前导通配符)导致全表扫描——不可扩展。想想FULLTEXT 索引。
    • WHERE this AND that OR other 执行 WHERE (this AND that) OR other,这可能不是您想要的。混合使用ANDOR 时,请添加括号以避免出错。
    • 标志(例如is_active)对缩放没有帮助。但是,不一定有更好的方法。
    • is_active != 0 -- 这是同时检查NULL(由于LEFT JOIN)的聪明方法吗?另见运营商<=>
    • 您需要LEFT 在所有 4 种情况下吗?
    • t1 是一个多:多映射——但是在哪两个表之间? (我看到 3 列看起来像是指向其他表格的链接。)请参阅我的 efficiency 提示。
    • 为每个表提供SHOW CREATE TABLE 可能会有所帮助。

    【讨论】:

    • 当我看到你的回答时,我意识到我的问题是多么不准确。我会尽快添加更多细节。
    • 你可能是一个“温柔”的男孩;我在回答中感到“温柔”。你添加详细信息后,我会再看一遍。
    猜你喜欢
    • 2011-03-03
    • 1970-01-01
    • 2021-08-19
    • 2018-05-01
    • 1970-01-01
    • 2018-04-13
    • 2013-06-27
    • 2019-05-30
    • 1970-01-01
    相关资源
    最近更新 更多