我不是SQL专家,我有一个sql语句:
SELECT * FROM articles WHERE article_id IN
(SELECT distinct(content_id) FROM contents_by_cats WHERE cat_id='$cat')
AND permission='true' AND date <= '$now_date_time' ORDER BY date DESC;
表contents_by_cats
有11000行。
表articles
有2700行。
变量$now_date_time
和$cat
是php变量。
此查询返回值大约需要10秒钟(我认为因为它有嵌套的SELECT语句),10秒是一个很长的时间。
我怎样才能以另一种方式实现这一目标? (观看或加入)?
我认为JOIN会帮助我,但我不知道如何正确使用它来提及我提到的SQL语句。
提前致谢。
答案 0 :(得分:1)
JOIN
正是您所寻找的。尝试这样的事情:
SELECT DISTINCT articles.*
FROM articles
JOIN contents_by_cats ON articles.article_id = contents_by_cats.content_id
WHERE contents_by_cats.cat_id='$cat'
AND articles.permission='true'
AND articles.date <= '$now_date_time'
ORDER BY date DESC;
如果您的查询仍然没有您想要的那么快,请检查您是否有articles.article_id和contents_by_cats.content_id和contents_by_cats.cat_id的索引。根据数据,您可能还需要article.date的索引。
请注意,如果$cat
和$now_date_time
值来自用户,那么您应该准备并绑定查询,而不是仅仅将这些值转储到查询中。
答案 1 :(得分:1)
这是我们开始的查询:
SELECT a.*
FROM articles a
WHERE article_id IN (SELECT distinct(content_id)
FROM contents_by_cats
WHERE cat_id ='$cat'
) AND
permission ='true' AND
date <= '$now_date_time'
ORDER BY date DESC;
有两件事可以帮助这个查询。第一种是使用exists
而不是in
重写它,并简化子查询:
SELECT a.*
FROM articles a
WHERE EXISTS (SELECT 1
FROM contents_by_cats cbc
WHERE cbc.content_id = a.article_id and cat_id = '$cat'
) AND
permission ='true' AND
date <= '$now_date_time'
ORDER BY date DESC;
其次,您需要articles
和contents_by_cats
上的索引:
create index idx_articles_3 on articles(permission, date, article_id);
create index idx_contents_by_cats_2 on contents_by_cat(content_id, cat_id);
顺便说一句,您可以在MySQL中使用$now_date_time
函数而不是now()
。