如果我想在 b.int_name 与 c.d_name 或 c.b_name 或 d.syn 匹配时从表 a 和 b 中提取行,下面的查询是否正确?
SELECT DISTINCT a.n_id,
a.dis,
b.int_name
FROM cdb a,
ct_int b,
d_b c,
d_syn d
WHERE a.dis LIKE '%hunt%'
&& a.n_id=b.n_id
&& b.int_name NOT LIKE 'NA'
&& b.int_type NOT LIKE 'NA'
&& (b.int_name NOT LIKE c.d_name
OR b.int_name NOT LIKE c.b_name
OR b.int_name NOT LIKE d.syn);
此查询执行花费了大量时间。如果我给出限制为 10 或 20 的上述查询,它很快就会出现,但如果没有限制,则会卡住很长时间,并且不知道它是否会给出结果。请这方面的指导。提前致谢...
最佳答案
首先,编写正确的连接,而不使用已弃用的语法,它将使您能够看到自己在做什么。
您当前正在连接 4 个表,且具有一个良好的连接条件。其余的连接将执行非常糟糕,特别是因为您正在执行看起来像“字符串不像字符串”的连接 - 规范化您的数据,并且永远不要在 varchar 上进行 jon ,除非您确实必须这样做。其次,在您的情况下, NOT LIKE
相当于 !=
。使用它。
第二,
&& b.int_name NOT LIKE 'NA'
&& b.int_type NOT LIKE 'NA'
写成这样可能会更快
&& b.int_name != 'NA'
&& b.int_type != 'NA'
第三:post表结构和预期结果。也许有交叉连接的替代方案。
关于mysql - MySQL中用命令或函数查询执行情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19400026/