此语句似乎效率低下,因为只选择了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' "
编辑:即使没有找到评论,我也想要标题记录。
答案 0 :(得分:1)
您可以在A
和nid
列添加索引。
答案 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
- 基于什么?
您应该了解有关查询执行的基本知识:
你觉得某些查询“不好”并不意味着什么。您需要检查执行计划,然后查看是否有任何可以提高性能的方法。
对于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/