2011-08-29 183 views
0

我有一個使用了大量的聚合函數來對每個項目(相冊)建立數據的查詢。這些數據非常重要,需要在那裏。目前,查詢本身需要大約1.5秒的時間才能執行,這太長了。如何優化這個MySQL查詢?

我已經創建了這些功能,因爲有相當多的是都需要做這些計算幾個疑問,所以這是有道理的他們放在各自的功能,便於代碼的可維護性的。否則,每當一個條件發生變化時,就會有5個或更多的地方去尋找並做出改變。

我真的想知道我能做些什麼,使這個查詢更快。很明顯,聚合函數是罪魁禍首,因爲如果我用一個簡單的SELECT *替換它,它會在大約0.1秒內運行。

我能想到的是消除聚合函數,做內唯一加入/子查詢的需要進行聚合的各個項目。正如你可以想象的那樣,我真的不想這樣做,因爲它需要重構其他地方的負載,並使代碼維護非常混亂。

有什麼建議嗎?謝謝!

SELECT 
fnAlbumGetNumberOfPhotos(albumId,1,0, 100) AS albumNumberOfPhotos, 
fnLikeGetCount(1, 3, album.albumId) AS albumLikeCount, 
fnGetAlbumPhotoViewCount(albumId) AS albumNumberOfPhotoViews, 
fnLikeGetDoesUserLikeDislike(1, 3, album.albumId, 100) AS albumDoesUserLike, 
fnObjectTagGetObjectTags(3, albumId) AS albumTags 
FROM 
album 
WHERE 0 = 0 
-- AND insert additional filters here 
LIMIT 0,15 

功能都簡單集合函數,e.g:

​​
+3

如果你會給那些功能的源代碼,我們就能夠理解,有什麼可以優化... Currenlty,這個問題是沒有意義的... – Deele

+0

@Deele:我因爲它們是基本的集合函數,所以並沒有真正看到需求,但是如果我錯了,我已經發布了其中一個函數。他們幾乎都是一樣的。每個聚合函數爲查詢添加大約0.250秒。 – Cheeky

+0

這個查詢應該做什麼工作?什麼是你想要的輸出,什麼是你想要使用的表?大多數的時候,一切都可以用另一個之路探尋到解決方案來解決,如果是一些好康畫廊,我敢肯定,輸出可以是結構化,在更小的位分,或有可能在表中增加了一些更多的列,這將有助於去解決問題。 Currenlty,我在這些SQL中沒有看到任何變化,這可以大大提高性能。 – Deele

回答

2

當SQL優化器構建執行計劃,用於查詢它分裂成查詢奇異操作,然後與他們操縱。不幸的是,函數是sql優化器的一個「黑盒子」 - 它不知道該函數內部是什麼,並將函數調用視爲單一操作。 如果性能是您所查詢的關鍵:

  1. 重新檢查您的索引表上的
  2. INLINE你的函數調用 - 在這種情況下,查詢優化器可以建立 最優的執行計劃的基礎上的指數
  3. 代替對.2您可以使用視圖(當然如果可能的話) - 他們 對於優化器是透明的。

希望這有助於