MySql中有一条奇怪的规则,它基本上说,如果你想创建一个视图,并且你想在视图中使用GROUP BY, DISTINCT, UNION
等结构,你就不能用ALGORITHM = MERGE
创建视图!点击此处阅读更多信息。
这基本上意味着,如果你在MySql中创建了一个视图,并且你的视图中有GROUP BY之类的东西,如果你运行一个查询,比如:
select * from MyView
where foo = 2
然后MySql将从MyView中读取所有行,并将其放入临时表中,然后将where子句(foo=2)应用于临时表并返回结果。
问题是,如果你的视图有1000万行,它会得到所有的10M行,然后应用where子句,这是非常低效的。
那么,有人知道这背后的理由是什么吗?我知道MS Sql Server没有这么做,我打赌Oracle也没有这么做。
几年前,MySQL论坛上也有人问过类似的关于联合视图的问题。一位MySQL开发人员同意,使用UNION
在视图上实现MERGE
算法应该很容易,但AFAIK仍然没有实现!