mysql视图超级慢

时间:2013-07-16 15:59:05

标签: mysql sql database mysql-slow-query-log

这是查询统一医学语言系统(UMLS)以查找与标准化单词相关的单词。这个查询结果是165MS,但如果我正在运行同一个查询的VIEW,则需要70秒。我是mysql的新手。请帮帮我。

查询:

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'

2 个答案:

答案 0 :(得分:9)

通过将VIEW ALGORITHM指定为MERGE,您可以获得更好的性能。使用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...

答案 1 :(得分:0)

假设mrxnw_eng.nwd在功能上依赖于mrxnw_eng.cui,请尝试更改视图的group by子句以包含a.nwd - 如下所示:

group by a.cui, a.nwd