我有两个问题:
首先,如果我在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条记录上尝试过滤到id=5的位置?这会让景色变得很慢。。。
其次,我认为视图没有索引。所以即使 surname
被编入索引,我执行
SELECT * FROM peopleView WHERE surname = 'Smith'
查询是否仍然需要遍历每个记录才能找到所有的“smiths”,即使 Surname
是索引的,因为视图丢失了所有索引?主键也一样吗?如果 id
是主键吗
SELECT * FROM peopleView WHERE id = 563
必须遍历所有记录 id
是主键并已索引,因为索引在视图中丢失?
谢谢
1条答案
按热度按时间r1wp621o1#
它如何在内部处理它取决于各种因素,有些是有记录的,有些是神秘的,但实际上是一个复杂的过程
VIEW
就像一个宏。视图通常没有索引,但它们可以使用各自表上的索引。如果/当mysql支持“物化视图”(类似于预计算视图)时,情况会发生很大变化。
有些平台实际上允许您
INSERT
变成一个VIEW
如果最后的陈述有意义的话。记得吗
EXPLAIN SELECT ...
可以告诉您mysql是如何理解您的查询的,并向您展示它将如何运行它。