使用count()执行完整表扫描的MySQL视图

使用count()执行完整表扫描的MySQL视图,mysql,sql-view,full-table-scan,Mysql,Sql View,Full Table Scan,考虑以下观点 CREATE VIEW `my_view` AS SELECT a.id, (SELECT COUNT( b.id ) FROM another_table b WHERE b.a_id = a.id AND b.other_column = 'ABC' ) AS counter FROM some_table a 某些表有数百万行,另一个表在a

考虑以下观点

CREATE VIEW `my_view` AS
SELECT
    a.id,
    (SELECT
            COUNT( b.id )
        FROM
            another_table b
        WHERE
            b.a_id = a.id AND b.other_column = 'ABC'
    ) AS counter
FROM
    some_table a
某些表
有数百万行,
另一个表
a\u id
+
其他列
上有索引

现在,考虑下面的SQL:

SELECT vw.*
FROM some_table a
LEFT JOIN my_view vw on vw.id = a.id
WHERE a.id = 12345
有人能告诉我为什么这个sql查询要对某个表进行完整的表扫描吗?目标是使视图返回另一个表中的行数,
other\u列
等于
'ABC'

如果将查询中的
LEFT JOIN my_视图
替换为
LEFT JOIN(视图中的AS子句)
,则它不会执行完整表扫描,而是使用a_id+其他列索引


我被难住了。非常感谢您的帮助。

通常在MySQL中查看。[我不想用那个词]。表现不如预期或想要的好。你认为:“哦,SQL引擎将把视图定义插入到我的查询中,然后对其进行优化。”你没有完全错。MySQL就是这样做的。它被称为视图的合并算法

不幸的是,没有多少有用的视图可以使用合并算法。基本上,您可以使用它重命名单个表上的字段和预计算表达式

另一种算法是诱人的算法。如您所见,这将创建一个临时表,并因此创建一个完整的表扫描

当然,你可以阅读更多关于这方面的文章

我不相信有任何简单的解决办法。您可以创建一个汇总表,并使用触发器使其保持最新。但我不认为这是“简单的”