我如何优化这个SQL查询?

时间:2018-06-05 08:19:39

标签: sql

我有一些SQL查询,但它非常强大地加载服务器,因为此查询可能有数百名用户:

SELECT *
FROM questions
WHERE date > '$day'
  AND answer!=''
  AND tos IN
   (
     SELECT tos
     FROM subscribers 
     WHERE froms='$myid'
   )
ORDER BY date DESC LIMIT $start, $limit 

开始&那里的分页限制(增加10乘10)。

2 个答案:

答案 0 :(得分:0)

您应该在表中创建索引(尽可能创建关系)。以下JOIN可以帮助您

 SELECT q.*
 FROM questions q
 INNER JOIN subscribers s
 ON q.tos=s.tos
 WHERE q.date > '$day'
   AND q.answer<>''
   AND s.froms='$myid'
 ORDER BY q.date DESC LIMIT $start, $limit 

按建议使用EXISTS

  SELECT *
  FROM questions q
  WHERE date > '$day'
    AND answer!=''
    AND EXISTS 
     (
       SELECT *
       FROM subscribers s
       WHERE s.froms='$myid' AND s.tos=q.tos
     )
  ORDER BY date DESC LIMIT $start, $limit 

PS:由于这个美元符号$LIMIT,它听起来像Php MySQL ...如果是,请添加这两个标签以避免与纯SQL混淆。现在可以在纯SQL中对数据进行分页:它取决于您的DBMS

答案 1 :(得分:0)

查询看起来很好。我什么都看不到。您可以做的是提供索引:

create index idx1 on subscribers(froms, tos);
create index idx2 on questions(tos, date, answer);
create index idx3 on questions(tos, answer, date);

(我不知道idx2或idx3是否更好。检查正在使用哪一个并放弃另一个。)

关于分页:这会导致选择所有数据并使用每次调用对其进行排序。这可能比简单地一次性检索它并在您的应用程序或网站中处理分页要慢得多。 (如果在调用之间将数据输入到表中,您也可以获得相应的记录,如果有人正在删除行,则可能存在间隙。)