2010-04-22 74 views
0

此語句效率不高,因爲只有10個記錄中的一個被選中,並且只有100個條目中的1個包含註釋。具有嵌套SELECT的mysql語句 - 如何提高性能

我該怎麼做才能改善它?

$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

你可以嘗試使用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' 
+0

看起來更乾淨但不確定是否有任何性能提升。我也想包括記錄,即使評論計數爲零。如果我在where子句中找到匹配項,我寧願挖掘註釋文件。 – ernie 2010-04-22 11:02:22

+0

我使用'Left Join',所以你得到'header_file'的所有行,也是那些沒有評論的。您當前的解決方案確保僅爲在「Where」子句中匹配的標題讀取註釋。通過我的解決方案,優化器將決定哪種方式更好。 – 2010-04-22 11:32:37

1

您可以在Anid列中添加索引。

+0

gos沒有說,但我檢查了一倍。 – ernie 2010-04-22 11:06:34

+0

當你處理艱難的編程問題時,沒有什麼「不言而喻」。「 – 2010-06-04 04:01:54

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' 
+0

是的,我想要標題,不管評論如何」左外連接「更合適 – ernie 2010-04-22 11:05:54

+0

我已經看過使用臨時文件或」with「子句,也許在這裏更合適 – ernie 2010-04-22 11:08:11

0

直接插入註釋計數表中,COUNT(*)是不是很有效。

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

+0

@Telos:閱讀該鏈接仔細地說,它談到了'SELECT COUNT(*)'在沒有WHERE子句的情況下選擇速度很慢,這不適用於當前的情況,索引可以並將被使用 – 2010-04-22 11:35:49

+0

我剛剛在http://中找到了這個語法www.selikoff.net/2008/12/10/memo-avoid-nested-queries-in-mysql-at-all-costs/。試圖使它適用於我 SET X = CallDatabase(「SELECT DISTINCT widgetId FROM widgetOrders「); CallDatabase(」SELECT id,name,price FROM widgets WHERE id IN(「+ X +」)「); – ernie 2010-04-22 11:40:25

1

從問題:

這種說法顯得缺乏效率...

你怎麼知道它是無效的?
你有執行計劃嗎?
您是否測量執行時間?
你確定它使用索引?
您評論Peter Lang的回答:... not sure if any performance gain here - 是基於什麼?

你應該知道的查詢執行基本的東西:

  • 大多數現代RDBMS-S具有查詢優化器來分析你的SQL,並確定最優的執行計劃。

你覺得某些查詢是「壞」並不意味着什麼。您需要檢查執行計劃,然後查看是否有任何可以改進性能的方法。

對於MySQL,請參閱文章:7.2.1. Optimizing Queries with EXPLAIN

你也可以從運行SQL的答案和比較的執行計劃以查看是否有任何建議的解決方案的提供更好的性能。

+0

感謝您的真實性檢查。 url.com/26bxbq8查詢實際上比我上面的示例稍微複雜一些,現在只有有限的測試數據。我看到還有更多的索引要添加。 – ernie 2010-04-22 11:50:42