当我在MySQL中使用WHERE调用视图时会发生什么

时间:2018-08-02 08:30:57

标签: mysql sql

我有两个问题:

首先,如果我在MySQL中有一个简单的视图,如下所示:

CREATE VIEW `peopleView` AS
SELECT id, name, surname FROM people

然后执行以下查询:

SELECT * FROM peopleView WHERE id = 5

MySQL服务器会在后台创建类似的东西吗?

SELECT id, name, surname FROM people WHERE id = 5

换句话说,它不首先执行视图,它可能返回5000条记录,然后在这5000条记录上尝试过滤为WHERE id = 5?这会使视图变慢...

第二,我认为视图没有索引。因此,即使surname被索引了,我也会执行

SELECT * FROM peopleView WHERE surname = 'Smith'

即使Surname被索引了,因为视图丢失了所有索引,查询是否仍然必须遍历每条记录以查找所有的'Smith'? 主键是否一样?如果id是主键,则将

SELECT * FROM peopleView WHERE id = 563

即使id是主键并已建立索引,也必须遍历所有记录,因为索引在视图中丢失了吗?

谢谢

1 个答案:

答案 0 :(得分:2)

它在内部如何处理取决于多种因素,有些因素有据可查,有些神秘,但实际上VIEW的作用就像一个宏。视图通常没有索引,但是它们可以在各自的表上使用索引。

如果/当MySQL支持“物化视图”(类似于预先计算的视图)时,这会发生很大变化。

如果结果说明有意义,某些平台实际上允许您将INSERT变成VIEW

请记住,EXPLAIN SELECT ...可以告诉您MySQL如何理解您的查询并向您显示如何运行它。