这是查询统一医学语言系统(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'
答案 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