我需要在两个表上选择任何出现的单词(关键字搜索),我所做的查询是这样的:
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%';
任何帮助都将非常感激……谢谢。
你的第一个语句不是你想要的: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之间的(有点歪斜)自然连接返回远到许多行。
Try MATCH..查询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全文搜索