多对多的关系表现

时间:2013-06-28 14:12:58

标签: mysql performance many-to-many

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

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


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


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

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

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

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

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

1 个答案:

答案 0 :(得分:1)

该查询的最佳性能是永久存储它。这是您需要物化视图。

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

这是

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

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

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

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

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