2013-07-16 103 views
6

這是查詢統一醫學語言系統(UMLS)查找與規範化單詞相關的單詞。這個查詢結果是165MS,但如果我運行VIEW查詢這個相同的查詢它需要70秒。我是新來的MySQL。請幫幫我。mysql view super slow

查詢:

SELECT a.nwd as Normalized_Word, 
     b.str as String, 
     c.def as Defination, 
     d.sty as Semantic_type 
FROM mrxnw_eng a, mrconso b, mrdef c, mrsty d 
WHERE a.nwd = 'cold' 
    AND b.sab = 'Msh' 
    AND a.cui = b.cui 
    AND a.cui = c.cui 
    AND a.cui = d.cui 
    AND a.lui = b.lui 
    AND b.sui = a.sui 
group by a.cui 

視圖定義:從視圖

create view nString_Sementic as 
SELECT a.nwd as Normalized_Word, 
     b.str as String, 
     c.def as Defination, 
     d.sty as Semantic_type 
FROM mrxnw_eng a, mrconso b, mrdef c, mrsty d 
WHERE b.sab = 'Msh' 
    AND a.cui = b.cui 
    AND a.cui = c.cui 
    AND a.cui = d.cui 
    AND a.lui = b.lui 
    AND b.sui = a.sui 
group by a.cui 

選擇:

select * nString_Sementic 
where nwd = 'phobia' 
+1

這兩個選擇字符串是不同的?視圖語句中的一個缺少'a.nwd ='cold''。我不確定會增加多少額外結果,但這可能會對性能產生很大影響。 – ernie

+1

這似乎是一個MySQL「bug」:http://www.mysqlperformanceblog.com/2007/08/12/mysql-view-as-performance-troublemaker/ –

回答

7

您可以通過指定VIEW算法作爲合併,以獲得更好的性能。通過MERGE,MySQL將把視圖與你的外部SELECT的WHERE語句結合起來,然後提出一個優化的執行計劃。

要做到這一點,你必須從VIEW中刪除GROUP BY語句。事實上,如果您的視圖中包含GROUP BY語句,MySQL將選擇TEMPLATE算法。首先在您的WHERE語句過濾之前先創建一個臨時表。

如果不能使用MERGE算法,則必須使用臨時表 代替。 MERGE不能用於如果視圖包含任何 下列構建體:

集合函數(SUM(),MIN(),MAX(),COUNT(),等等)

DISTINCT

GROUP BY

HAVING

LIMIT

UNION或UNION ALL

子查詢在選擇列表

僅指文字值(在這種情況下,不存在潛在的 表)

下面是詳細信息的鏈接。 http://dev.mysql.com/doc/refman/5.0/en/view-algorithms.html

如果你可以改變你的看法不包括在GROUP BY語句,來指定視圖的算法語法是:

CREATE ALGORITHM = MERGE VIEW... 
+0

非常感謝你Alden。我非常感謝你的幫助。 –

0

假設mrxnw_eng.nwd函數依賴於mrxnw_eng.cui,嘗試通過條款變更羣組的觀點包括a.nwd - 像這樣:

group by a.cui, a.nwd 
+0

非常感謝你馬克。 –