mysql视图超级慢

Jam*_*oni 8 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
Run Code Online (Sandbox Code Playgroud)

查看定义:

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   
Run Code Online (Sandbox Code Playgroud)

从视图中选择:

 select * nString_Sementic   
 where nwd = 'phobia'
Run Code Online (Sandbox Code Playgroud)

Ald*_* W. 10

通过将VIEW ALGORITHM指定为MERGE,您可以获得更好的性能.使用MERGE MySQL将视图与外部SELECT的WHERE语句结合起来,然后提出优化的执行计划.

但要执行此操作,您必须从VIEW中删除GROUP BY语句. 实际上,如果您的视图中包含GROUP BY语句,MySQL将选择TEMPLATE算法.在由WHERE语句过滤之前,首先要创建整个视图的临时表.

如果不能使用MERGE算法,则必须使用临时表.如果视图包含以下任何构造,则不能使用MERGE:

聚合函数(SUM(),MIN(),MAX(),COUNT()等)

不同

通过...分组

HAVING

限制

UNION或UNION ALL

选择列表中的子查询

仅指文字值(在这种情况下,没有基础表)

这是更多信息的链接.http://dev.mysql.com/doc/refman/5.0/en/view-algorithms.html

如果您可以将视图更改为不包含GROUP BY语句,则要指定视图的算法,语法为:

CREATE ALGORITHM = MERGE VIEW...
Run Code Online (Sandbox Code Playgroud)