0

私は3つのテーブルを持っています。私のニュースには 1 つまたは複数のカテゴリがあります。

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


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


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

しかし、ニュースには約10,000,000行の行がたくさんあります。データのフェッチに結合を使用すると、パフォーマンスの問題が発生します。

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 に答える