我有3张桌子:
新闻: ID,标题,日期
标签: ID,姓名
News_Tag: id_tag,id_news
我有一个像这样的mysql语句的搜索功能:
SELECT DISTINCT
news.title,
news.id,
FROM
news,
tags,
news_tag
WHERE
news.date > now()
AND (
news.title LIKE '%brasil%'
OR (
tags. NAME = 'brasil'
AND news_tag.id_news = news.id
)
)
Pero esta toma mucho tiempo,que estoy haciendo mal?
答案 0 :(得分:1)
我建议您避免使用旧的逗号运算符语法进行连接操作,而是使用JOIN关键字。
SELECT DISTINCT news.title
, news.id
FROM news
LEFT
JOIN news_tag
ON news_tag.id_news = news.id
LEFT
JOIN tags
ON tags.id = news_tag.id_tag
WHERE news.date > NOW()
AND (news.title LIKE '%brasil%' OR tags.name = 'brasil')
适当的索引可能会提高绩效:
... ON tags (name, ...)
... ON news_tag (id_news, id_tag)
注意:此查询(实际上是对两个查询的UNION设置操作)将返回相同的结果:
SELECT news.title
, news.id
FROM news
WHERE news.date > NOW()
AND news.title LIKE '%brasil%'
UNION
SELECT n.title
, n.id
FROM news n
JOIN news_tag
ON news_tag.id_news = n.id
JOIN tags
ON tags.id = news_tag.id_tag
AND tags.name = 'brasil'
WHERE n.date > NOW()