8

这是统一医学语言系统 (UMLS) 查找与规范化单词相关的单词的查询。此查询结果为 165 毫秒,但如果我正在运行同一查询的 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'
4

2 回答 2

13

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

但是,要做到这一点,您必须从 VIEW 中删除 GROUP BY 语句。 实际上,如果您的视图中包含 GROUP BY 语句,MySQL 将选择 TEMPLATE 算法。在被 WHERE 语句过滤之前,首先会为整个视图创建一个临时表。

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

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

清楚的

通过...分组

拥有

限制

UNION 或 UNION ALL

选择列表中的子查询

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

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

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

CREATE ALGORITHM = MERGE VIEW...
于 2013-07-16T16:17:08.913 回答
0

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

group by a.cui, a.nwd
于 2013-07-16T16:24:04.943 回答