【问题标题】:How to optimize MySQL query which contains table and left join of sql view如何优化包含表和sql视图左连接的MySQL查询
【发布时间】:2011-06-27 15:15:45
【问题描述】:

我有这个问题:

SELECT a.id, b.discount FROM (a LEFT JOIN b ON b.id_a = a.id);

这个查询的解释命令是这样的:

id  select_type   table  type   possible_keys   key       key_len  ref    rows   Extra
1    SIMPLE        a      index  NULL            PRIMARY   4        NULL   1489   Using index
1    SIMPLE        b      ALL    NULL            NULL      NULL     NULL   819   

A 是有 1489 行的表,B 是 SQL 视图。现在我明白了,MySQL 必须执行 1489*819 操作,这太不优化了。如果 B 是一个表,我会为列 id_a 创建一个索引,但我不知道如何处理 SQL 视图。

有人可以帮忙吗?

【问题讨论】:

  • 视图实际上只是一个存储的查询。相同的优化技术适用于视图,就像您在主查询中直接使用视图的基础查询一样

标签: mysql query-optimization sql-view


【解决方案1】:

我会查看视图,并尝试转到原始表来限定您关注的元素是否存在。并确保“b”视图的根表在该键上有一个索引。

【讨论】:

  • 完美运行!非常感谢,我想我怎么会错过它,现在看起来很合乎逻辑。我刚刚在视图 B 中使用的表的键上添加了索引。
【解决方案2】:

您也可以尝试使用索引创建临时表,而不是使用视图(未索引)。我们对一些冗长的报告查询进行了此操作,并因此获得了一些令人印象深刻的速度提升(当然是 YMMV)。

【讨论】:

    【解决方案3】:

    切换表格和视图可能会有所帮助。

    示例:

    SELECT a.id, b.discount FROM (b RIGHT JOIN a ON b.id_a = a.id);
    

    【讨论】:

      猜你喜欢
      • 2017-04-04
      • 2014-08-10
      • 1970-01-01
      • 2023-01-03
      • 1970-01-01
      • 2020-02-14
      • 1970-01-01
      • 2011-04-29
      • 2019-09-03
      相关资源
      最近更新 更多