3

我需要在两个表上选择任何出现的单词(关键字搜索),我所做的查询是这样的:

SELECT t1.fname, t1.lname, t2.* FROM t1 , t2  
     WHERE t2.title LIKE "%test%" 
     OR t2.desc LIKE "%test%" 
     OR t2.inc LIKE "%test%" 
     OR t1.fname LIKE "%test%" 
     OR t1.lname LIKE "%test%" 
     AND t1.c_id = t2.c_id;

由于数据库中有很多数据,这个特定的搜索(使用'test'关键字)需要几分钟,我想知道如何优化它。我尝试使用 LEFT JOIN,但似乎我做错了 - 因为结果非常延迟,但查询执行得非常快。

它是这样的:

SELECT * FROM t2 AS a 
  LEFT JOIN t1 AS b ON a.c_id = b.c_id 
    WHERE a.desc LIKE '%test%' 
     OR a.title LIKE '%test%' 
     OR a.inc LIKE '%test%' 
     OR b.fname LIKE '%test%'  
     OR b.lname LIKE '%test%';

任何帮助将不胜感激......谢谢。

4

2 回答 2

2

您的第一个陈述不是您想要的:该AND子句优先OR您实际编写的

t2.title LIKE "%test%" 
OR t2.desc LIKE "%test%" 
OR t2.inc LIKE "%test%" 
OR t1.fname LIKE "%test%" 
OR (t1.lname LIKE "%test%" AND t1.c_id = t2.c_id;)

这最终导致 t1 和 t2 之间的(有些倾斜的) 自然连接返回到许多行。

于 2013-01-09T08:01:23.670 回答
2

尝试MATCH..AGAINST在多个列中搜索MyISAM表:

SELECT * 
FROM t2 AS a 
INNER JOIN t1 AS b ON a.c_id = b.c_id 
WHERE MATCH (a.desc, a.title, a.inc, b.fname, b.lname) AGAINST ('test') 

检查此链接MYSQL 全文搜索

于 2013-01-09T08:45:51.757 回答