我有两个问题:
首先,如果我在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
是主键并已建立索引,也必须遍历所有记录,因为索引在视图中丢失了吗?
谢谢
答案 0 :(得分:2)
它在内部如何处理取决于多种因素,有些因素有据可查,有些神秘,但实际上VIEW
的作用就像一个宏。视图通常没有索引,但是它们可以在各自的表上使用索引。
如果/当MySQL支持“物化视图”(类似于预先计算的视图)时,这会发生很大变化。
如果结果说明有意义,某些平台实际上允许您将INSERT
变成VIEW
。
请记住,EXPLAIN SELECT ...
可以告诉您MySQL如何理解您的查询并向您显示如何运行它。