MySQL 视图非常缓慢,为什么?

4

我的常规查询:

SELECT
    DISTINCT vt.id as id,
    vtt.name as n,
    vt.etxid as etx
FROM vt
LEFT JOIN vtt ON
    (vtt.locale = "etx"
    AND vtt.etxid = vt.etxid)

执行时间:5毫秒

我的观点:

CREATE OR REPLACE VIEW myview AS
SELECT
    DISTINCT vt.id as id,
    vtt.name as n,
    vt.etxid as etx
FROM vt
LEFT JOIN vtt ON
    (vtt.locale = "etx"
    AND vtt.etxid = vt.etxid)

我的视图查询:

SELECT * from myview;

执行时间: 600毫秒


你确定这是可以重现的吗?假设底层数据相同,执行计划和运行时间应该大致相同。底层数据有改变吗? - Tim Biegeleisen
仅供观察,MySQL中的VIEW没有任何有用的目的。 - Strawberry
数据没有改变。 - Erik
找到了一个更好的重复问题:https://dev59.com/NnE85IYBdhLWcg3wejZO - underscore_d
@Strawberry Views 在 MySQL 中确实具有非常有用的作用。如果您正在使用像 Django 这样的框架,您可以避免在必要时使用原始 SQL 查询,而是让您的模型指向一个预先组合查询的视图,而不是一个表。这样,您就可以继续使用常规的 queryset ORM,并保持 Django 和 sql 的分离。其他框架可能也是如此。 - kloddant
1个回答

1
一旦在视图中提到DISTINCT或聚合函数,MySQL会选择TEMPTABLE算法用于该视图,这意味着它将为该视图创建一个临时表,然后对其进行排序、分组和聚合。更多详情请查看此处。此外,这里还有一些关于视图性能的建议

我曾将此标记为另一个或两个问题的重复,但后来我意识到它们没有像这个问题一样好(即引用,非推测性的)答案,所以现在我将它们作为此问题的重复。 :-) - underscore_d

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接