SQL:如何减少语句执行时间?

时间:2015-03-29 15:08:58

标签: mysql join

我不是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语句。

提前致谢。

2 个答案:

答案 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;

其次,您需要articlescontents_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()