使用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就是这样做的。它被称为视图的合并算法 不幸的是,没有多少有用的视图可以使用合并算法。基本上,您可以使用它重命名单个表上的字段和预计算表达式 另一种算法是诱人的算法。如您所见,这将创建一个临时表,并因此创建一个完整的表扫描 当然,你可以阅读更多关于这方面的文章 我不相信有任何简单的解决办法。您可以创建一个汇总表,并使用触发器使其保持最新。但我不认为这是“简单的”