0

我有三张桌子。我的新闻有一个或几个类别。

News
-------------------------
| id   |  title |  created


Category
-------------------------
| id   |  title


News_Category
-------------------------
| news_id | category_id

但是我在新闻上有很多行,大约 10,000,000 行。使用 join 获取数据将是性能问题。

Select title from News_Category left join News on (News_Category.news_id = News.id)
group by News_Category.id order by News.created desc limit 10

我想对此问题进行最佳查询。对于大表中的多对多关系数据,查询性能更好。

请给我这个用​​例的最佳查询。

4

1 回答 1

1

该查询的最佳性能是通过永久存储来获得的。这是您需要的物化视图。

在 MySQL 上,您可以通过创建表来实现物化视图。

这是

create table FooMaterializedView as
(select foo1.*, foo2.* from foo1 join foo2 on ( ... ) where ... order by ...);

现在取决于源表更改的频率(这是接收插入、更新或删除)以及您需要使用多少最新版本的查询来实施合适的视图维护策略

这取决于您的需求和问题本身的执行情况:

  1. 完全计算(即截断物化视图并从头开始重新生成)可能就足够了
  2. 增量计算。如果系统经常执行完整计算的成本太高,则必须捕获源表上的更改并根据更改更新物化视图。

如果您需要采用增量方法,我只能祝您好运。我可以指出您可以使用触发器来捕获源表上的更改,并且您将需要使用算法或均衡方法来计算对物化视图所做的更改。

于 2013-06-28T14:45:02.930 回答