2013-07-16 26 views
6

Bu, normalleştirilmiş sözcükle ilgili bir kelime bulmak için Birleşik Tıbbi Dil Sistemi (UMLS) sorgusudur. Bu sorgu sonucu 165MS'dir, ancak aynı sorguyu VIEW çalıştırıyorsam 70 saniye alıyor. Ben mysql için yeni. Lütfen bana yardım et.mysql süper yavaş göster

Sorgu:

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 

Görünüm tanımı: görünümden

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 

Seçim:

select * nString_Sementic 
where nwd = 'phobia' 
+1

İki seçim dizesi farklı mıdır? Görüş bildirisindeki tek şey "a.nwd =" cold' "içermiyor. Ekleyeceğim kaç ekstra sonuç olduğundan emin değilim, ancak bu performansı çok fazla etkileyebilir. – ernie

+1

Bu bir MySQL "bug" gibi görünüyor: http://www.mysqlperformanceblog.com/2007/08/12/mysql-view-as-performance-troublemaker/ –

cevap

7

Birleştirmek olarak GÖRÜNÜM ALGORİTMAYI belirterek daha iyi performans elde etmek mümkün olabilir. MERGE MySQL ile görünümü dış SELECT'in WHERE ifadesiyle birleştirir ve daha sonra optimize edilmiş bir yürütme planı hazırlar.

Ancak bunun için GROUP BY ifadesini VIEW uygulamasından kaldırmanız gerekir. Olduğu gibi, GROUP BY ifadesi görünümünüzde varsa, MySQL TEMPLATE algoritmasını seçer. WHERE ifadeniz tarafından filtrelenmeden önce, önce tüm görünümün geçici bir tablosu oluşturuluyor.

Eğer MERGE algoritması kullanılamıyorsa, bunun yerine geçici bir tablo kullanılmalıdır. BİRLEŞTİRME görünüşüdür içeriyorsa kullanılamaz aşağıdaki yapılardan herhangi birini:

DISTINCT (benzeri SUM(), min(), MAX(), COUNT(), ve benzeri)

Agrega fonksiyonları

SINIR

UNION veya UNION ALL

HAVING

TARAFINDAN

GRUBU Seçim listesinde

yılında

Alt sorgusu

Burada daha fazla bilgi içeren link (Bu durumda, hiçbir altta yatan tablo vardır) sadece edebi değerleri ifade eder. http://dev.mysql.com/doc/refman/5.0/en/view-algorithms.html

Eğer BY ifadesi GROUP içermez için görünümünüzü değiştirebilir Eğer sözdizimi görünümün algoritmasını belirtmek için: mrxnw_eng.nwdmrxnw_eng.cui üzerine işlevsel olarak bağlı olduğunu varsayarsak

CREATE ALGORITHM = MERGE VIEW... 
+0

Teşekkür ederim Alden. Yardımın için sağol. –

0

, fıkra tarafından grubunu değiştirmeyi deneyin a.nwd - görünümüne dahil etmek gibi -

group by a.cui, a.nwd 
+0

Çok teşekkürler Mark. –