我的查询现在运行正常,但我担心可伸缩性和性能。
此查询用于搜索表t2和t3中的单词,并返回在t1
中匹配的过滤结果。 t1
是一个多对多的表格。
目标:
我有3个表,用户(user_id
)可以插入记录。如果user_id
有恶意并在3个表中的任何一个中创建不适当的内容,我希望能够快速过滤其内容。当我使用innoDB时,我可以立即删除user_id
从用户表创建的所有内容,但我希望保留user_id
行为的痕迹,以便稍后进行进一步分析。
情况:
user_id
,t1
,t2
中有一个类似的字段t3
。 src_wd
和t2
中搜索单词(t3
)。 src_word
位于t2
或t3
,则返回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%'
我的关注:
我的担忧与user
表 u1
u2
u3
上的多个联接有关,我会得到我想要的结果。
我可以稍后优化,但我正在学习,所以为什么不尝试从现在开始的好方法。感谢
答案 0 :(得分:1)
多个问题:
LIKE '%...'
(领先的外卡)会导致全表扫描 - 无法扩展。考虑FULLTEXT
索引。WHERE this AND that OR other
执行WHERE (this AND that) OR other
,这可能不是您想要的。混合AND
和OR
时,请添加括号以避免蠢事。is_active
)无助于缩放。但是,并不一定有更好的方法。is_active != 0
- 这是一种同时检查NULL
(由于LEFT JOIN
)的聪明方法吗?另请参阅运算符<=>
。LEFT
吗?t1
是一个很多:很多映射 - 但在两个表之间? (我看到3列似乎与其他表的链接。)请参阅我的efficiency提示。SHOW CREATE TABLE
可能会有所帮助。