嵌套SELECT的mysql语句 - 如何提高性能

时间:2010-04-22 10:53:32

标签: sql mysql performance

此语句似乎效率低下,因为只选择了10条记录中的一条,而100条条目中只有1条包含注释。

我可以做些什么来改善它?

$query = "SELECT 
A,B,C,  
(SELECT COUNT(*)
    FROM comments
    WHERE comments.nid = header_file.nid) 
    as my_comment_count
FROM  header_file
Where A = 'admin' "

编辑:即使没有找到评论,我也想要标题记录。

5 个答案:

答案 0 :(得分:1)

您可以在Anid列添加索引。

答案 1 :(得分:1)

我在这里使用inner join因为听起来你只想要包含注释的header_file记录。如果不是这种情况,请将其更改为left outer join

select h.a, h.b, h.c, c.Count
from header_file h
inner join (
    select nid, count(*) as Count
    from comments
    group by nid
) c on c.nid = h.nid
where h.a = 'admin'

答案 2 :(得分:1)

问题:

  

这句话似乎效率低下......

你怎么知道效率低下?
你有执行计划吗?
你有没有测量执行时间? 你确定它使用索引吗?
您评论过Peter Lang的答案:... not sure if any performance gain here - 基于什么?

您应该了解有关查询执行的基本知识:

  • 大多数现代RDBMS都有查询优化器,可以分析您的SQL并确定最佳执行计划。

你觉得某些查询“不好”并不意味着什么。您需要检查执行计划,然后查看是否有任何可以提高性能的方法。

对于MySql,请参阅文章:7.2.1. Optimizing Queries with EXPLAIN

您还可以从答案中运行SQL并比较执行计划,以查看是否有任何建议的解决方案提供更好的性能。

答案 3 :(得分:0)

您可以尝试使用Left Join,这可以实现更好的优化:

Select a, b, c, Count(*) As my_comment_count
From header_file h
Left Outer Join comments c On ( c.nid = h.nid )
Group By a, b, c
Where A = 'admin'

答案 4 :(得分:0)

直接在表格中插入注释计数,count(*)效率不高。

http://www.mysqlperformanceblog.com/2006/12/01/count-for-innodb-tables/