【问题标题】:MySql view is very slow. Why?MySql 视图很慢。为什么?
【发布时间】:2020-07-10 10:36:05
【问题描述】:

我的正常查询:

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)

执行时间:5ms

我的看法:

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;

执行时间:600ms

【问题讨论】:

  • 你确定这是可重现的吗?假设相同的基础数据,执行计划和运行时间应该大致相同。基础数据是否发生了变化?
  • 只是观察一下,MySQL 中的 VIEW 没有任何用处
  • 数据没有变化。
  • @Strawberry 视图确实在 MySQL 中起到了非常有用的作用。如果您使用的是 Django 之类的框架,您可以避免使用原始 sql 查询,否则它们是必要的,而是让您的模型指向具有预组合查询而不是表的视图。这样,您可以继续使用常规查询集 ORM 并将 Django 和 sql 分开。其他框架可能也一样。

标签: mysql sql


【解决方案1】:

只要你在视图中提到 DISTINCT 或聚合函数,MySQL 就会为此视图选择 TEMPTABLE 算法,这意味着它将为视图创建一个临时表,然后对其应用排序、分组和聚合。查看更多详情here。还有一些recommendations here concerning view performance

【讨论】:

  • 我曾将此标记为对另一个或两个 Q 的欺骗,但后来我意识到他们都没有像这个那样好的(即引用的、非推测的)答案,所以现在我被欺骗了他们在这个:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-24
  • 2014-04-19
  • 1970-01-01
  • 2015-04-28
  • 2019-10-02
  • 2010-10-30
  • 2023-04-03
相关资源
最近更新 更多