如何过滤多个已连接表

时间:2017-05-11 16:48:38

标签: mysql join optimization innodb

我的查询现在运行正常,但我担心可伸缩性和性能。

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

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

情况

  • 我在三个已加入的表user_idt1t2中有一个类似的字段t3
  • 我在任何表src_wdt2中搜索单词(t3)。
  • 如果src_word位于t2t3,则返回t1 t2.id的结果。
  • 如果是恶意用户,我会将用户设置为user.is_active = 0

表格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%'

我的关注

我的担忧与useru1 u2 u3上的多个联接有关,我会得到我想要的结果。

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

1 个答案:

答案 0 :(得分:1)

多个问题:

  • LIKE '%...'(领先的外卡)会导致全表扫描 - 无法扩展。考虑FULLTEXT索引。
  • WHERE this AND that OR other执行WHERE (this AND that) OR other,这可能不是您想要的。混合ANDOR时,请添加括号以避免蠢事。
  • 标志(例如is_active)无助于缩放。但是,并不一定有更好的方法。
  • is_active != 0 - 这是一种同时检查NULL(由于LEFT JOIN)的聪明方法吗?另请参阅运算符<=>
  • 在所有4个案例中你需要LEFT吗?
  • t1是一个很多:很多映射 - 但在两个表之间? (我看到3列似乎与其他表的链接。)请参阅我的efficiency提示。
  • 为每个表提供SHOW CREATE TABLE可能会有所帮助。