我定义了几个基本视图(只有左连接操作的简单视图)。然后从这些基本视图中定义另一个简单视图(让它命名为inherited_view)。视图算法是合并。从inherited_view中简单选择执行可怕。
但我找不到来自'解释'输出。我也无法理解为什么表现如此糟糕。
然后我尝试直接从原始表重写inherited_view。然后它表现得更好。但是'解释'结果不会改变太多。我不确定为什么性能会提高。
以下是解释结果:
所以我的问题是,即使所有视图都是使用algorithm = merge创建的,性能也会很差。 感谢。
更新视图定义:
基本视图只是从几个表中选择列:
CREATE VIEW basic_View AS
SELECT column1, column2,....
FROM (((((table1
LEFT JOIN table2 ON table2.xid = table1.id
LEFT JOIN table3 ON table3.yid = table1.id
...
where ('string1' = tablex.column1) and (value = tabley.column2);
CREATE VIEW inherited_view AS
SELECT column1, column2....
FROM basic_view1
LEFT JOIN basic_view2 on ((basic_view2.result_id = basic_view1.id and basic_view2.name = 'string1'))
LEFT JOIN basic_view2 on ((basic_view2.result_id = basic_view1.id and basic_view2.name = 'string2'))
LEFT JOIN basic_view2 on ((basic_view2.result_id = basic_view1.id and basic_view2.name = 'string3'))
记录数为20万。 无论时间长短都没有缓存,无论我运行了多少时间。
测试性能的查询语句是:
SELECT * FROM inherited_view WHERE name1 = 'str1' and name2 = 'str2';
真正的性能数据是:(我首先运行快速数据。我认为没有缓存。数据保持一致。)
35组(21秒)用于观看视图
用于表格视图的35行(0.7秒)
可能的根本原因: 神奇的是在最后三个LEFT JOIN中,或者您可以检查解释结果中的最后三行。
CREATE VIEW inherited_view AS
SELECT column1, column2....
FROM basic_view1
LEFT JOIN basic_view2 on ((basic_view2.result_id = basic_view1.id and basic_view2.name = 'string1'))
LEFT JOIN basic_view2 on ((basic_view2.result_id = basic_view1.id and basic_view2.name = 'string2'))
LEFT JOIN basic_view2 on ((basic_view2.result_id = basic_view1.id and basic_view2.name = 'string3'))
basic_view2是一个简单的视图,数据如下:
result_id name value
1 owner Tom
1 status Fail
2 owner Jerry
2 status Pass
从解释结果的最后三行,您可以看到有两个possible_keys,第一个是列的索引' result_id',第二个是列的索引' name&# 39;
查询表格,使用第一个索引(' result_id')。
但查看视图的视图,使用第二个索引(' name')。
删除' name'的索引后,视图上的视图和桌面上的视图都会执行。
任何人都可以告诉我究竟发生了什么?感谢。