2011-07-22 16 views
1

まず、いくつかの詳細なJOIN - 私のウェブサイトで最適化は、ウェブサイトとデータベース構造について

を、あなたは英語の単語を学ぶことができ、あなたは、各単語の上の文章、協会、画像を挿入することができ、さらに、各単語にカテゴリ、サブカテゴリ、グループがあります。

私のデータベースには約20のテーブルが含まれています。私のウェブサイトに登録するユーザーは、4000行のようなものをユーザーのテーブルに「追加」する - 私のウェブサイト上の単語の数。私は重大な問題を抱えていますが、ユーザが単語をフィルタリングしている間に(検索語のようなものがありますが、char/sの&カテゴリ/ s &グループ)sqlクエリに9個のJOINがあります。結果を表示する..

の標的を結合する - テーブルユーザ内側(各ユーザーは4000行/各行=ワードを有する場合)、このスタイルに参加あります

$this->db->join('users', 'sentences.id = users.sentence_id' ,'left'); 

同じこと団体と、グループ、イメージ、単語間のバインドなど。 usersテーブルには文、関連、グループのIDが含まれています.JOINには接続があります。

私は何をすべきかわかりません。時間がかかりすぎます。おそらく問題はデータベースの構造ですか?複数の結合?おそらくインデックスを使用して?しかし、どうやってどこですか?索引付けが役に立たないようにすべての単語を検索する必要があるためです。

私はMySQLを使用しています。

+0

スキーマの投稿はどうですか?また、各テーブルにどのような処理が行われるのか、そのプロセスについても説明します。 1人のユーザーが4000行をユーザーテーブルに追加するのはなぜですか? –

答えて

1

まず、多くのジョインを使用している場合、インデックスはほとんどの場合ジョインでは使用されないため、インデックスを保存することはできません。

できることがいくつかあります。

スキーマ設計

あなたは9あなたがやっていることを達成するために加入する必要がある場合は、おそらくあなたのスキーマ設計/クエリを再考したいと思います!

見た目から、あなたのテーブルはおそらく3番目の正規形で正規化されているようですか?その場合、結合を避けるためにテーブルをより大きなものに非正規化することを検討してください(結合は全テーブルスキャンよりも高価です)。これに関する多くのオンライン文書がありますが、開発の複雑さとデータの冗長性が増すため、これには常にコストがかかります。また、テーブルを非正規化することで、結合を回避し、インデックスをよりよく使用することができます。

また、MyISAMはFULL TEXTインデックスをサポートするMySQLの唯一のストレージエンジンだと私は信じています。ただし、トランザクションはなく、テーブルレベルロックとMVCCがないため、必要なものによって異なります。

リソース

私はあなたがこの本High Performance MySQLのリードを持ってお勧めします。 MySQLデータベースのチューニングに関する本当に素晴らしい本

また、選択したストレージエンジンの公式ドキュメントを読むことをお勧めします。これは、各ストレージエンジンがのVERY DIFFERENTの場合に重要です。 InnoDBはMyISAMとはまったく異なり、PBXTとはまったく異なります。各エンジンにはメリットがあり、どちらがあなたの状況に合っているかを検討する必要があります。

0

私は、リレーショナル・スキーマを引き出し、実行している問合せの操作数を計算し、そこから実行します。暗黙的に問合せを最適化しようとするほとんどのDBMSの試みですが、必ずしも最適ではありません。最も制約の厳しいものが最初に実行されるように、結合の並べ替えを検討する必要があります。索引が役立つ可能性があります。また、検索する属性を見つけるために索引を使用する必要があります。

自然言語を扱うデータベースを構築することは非常に困難な課題であり、その件に関する多くの研究があります。あなたはマルコフ連鎖を見ましたか?あなたは一歩を踏み出し、あなたがしようとしているものの計算上の複雑さを考えましたか?あなたが9つの結合の同じ結論に到達した場合、その問題はリアルタイムアプリケーションのために十分にスケーラブルではないと言うことは公正かもしれません。

私は、Google App Engineのデータストアが暗黙のスケーラビリティを持って、あなたのために属性のインデックスを作成しようとしていると思います。小さなWebサーバーでデータベースを実行している場合は、より包括的なDBMSを使用してデータベースを展開する方が良い結果が得られます。私は最後の手段としてこれを検討しています。

関連する問題