1

我有一个查询,我想授予某人查看权限。该查询非常基本,但大致如下:

-- In actuality, this is a 60 line SQL query joining 5 tables
SELECT * FROM
<a bunch of joined tables>
GROUP by a.id

通常这个视图是在一个 id 上查询的(它在初始表上被索引),像这样:

SELECT * FROM ...
WHERE id < 10 AND row_last_modified > '2021-05-14 04:42:47'

运行正常查询(针对表,而不是视图)时,这通常在大约 10 毫秒内执行。然而,一旦我创建了这个视图,它似乎在做任何其他事情之前对每一行GROUP BY进行聚合,所以即使我获取一个 ID,查询仍然需要大约 5 分钟才能运行,从而使视图完全无法使用。在 mysql 中有没有办法解决这个问题,还是我只需要让最终用户访问所有这些表来执行查询而不是视图?

(我想另一种选择是在没有的情况下创建视图,GROUP BY然后告诉用户“您必须附加此GROUP BY a.id功能才能使查询正常工作,否则您将得到垃圾结果。”)

我读过的唯一处理这个问题的是mysql8中提供的下推:https ://dev.mysql.com/doc/refman/8.0/en/derived-condition-pushdown-optimization.html ,但也许我'我在这里遗漏了一些东西(手指交叉),有一种简单的方法可以做到这一点!


这是解释计划:

explain SELECT * from global_view where info_id=1;

在此处输入图像描述

在派生表上扫描的765375行似乎是杀手。

4

0 回答 0