2017-06-28 9 views
0

私は500GBのMySQLデータベースがある私の修士号のプロジェクトを行っています。私のプロジェクトはStackOverflowと関係があります。選択クエリを最適化する必要があります。実行するのに1分かかるため、私はJavaを使用してGUIを作成しているだけで、時間がかかりすぎると思っています。これは、私が持っているテーブルと関連情報です:複数のテーブルとビッグデータを使用したクエリの最適化

テーブル:22 222 747レコードのタグ。タグのための

Tags Table

インデックス。

Tags Index

表:8つの117 955レコードを持つリンク。蓋と援助の指標。 14件の401 786レコードを持つ回答:リンク

Links Index

表について

Links Table

インデックス。援助とqidに関する指数。回答

Answers Index

表について

Answers Table

インデックス:7つの495 155レコードを質問。質問のための

Questions Table

インデックス。

Questions Index

アイデアは、私は人々が答えを投稿するリンクをリダイレクト収集していると私のツールは、ユーザーが何を望んでいるかによって、いくつかのリンクをお勧めします。ユーザーは多くのタグを指定できますが、簡単にするために2つのタグを想定してみましょう。その後、私は1を追加し、ユーザーが3個の以上のタグを頼む場合

Explain

SELECT questions.title, links.url 
FROM questions, answers, links, tags 
WHERE questions.qid = tags.qid 
    AND answers.qid = questions.qid 
    AND answers.aid = links.aid 
    AND (tags.tag = 'php' OR tags.tag = 'mysql') 
GROUP BY tags.qid, links.url HAVING count(*) = 2; 

これは、上記のクエリの説明の絵です:これは私が使用していますクエリですより多くのOR条件とカウント(*)=タグの数。

私はMySQLのプロではないので、改善する方法があると確信しています。私はqid、援助とタグの長さが10のインデックスを作成しました。私はそれを回避する方法がない限り、可能であればテーブルを変更しないでください。

ありがとうございました!

+0

ポストデータモデル。クエリが実際に何をしているかを見ることができるように、実行計画(計画を説明)を投稿してください。 –

+0

私が持っているすべてのテーブルのすべてのインデックスを必要としていますか? – Paul

+0

クエリに関連するすべてのテーブル(すべて4です) –

答えて

0

この時点で、クエリは> 1.6mln行を処理する必要があります。

CREATE INDEX tags2 ON tags (tags, qid); 

または代替(最良の働き方のデータに依存し、私は本当のデータベースなしでそれをテストすることはできません):

CREATE INDEX tags3 ON tags (qid, tag); 
これは、タグテーブル上のマルチカラムインデックスで還元される可能性があります

多くのインデックスの欠点は、挿入と更新が遅くなることです。そのことを防ぐために、計画に従って使用されていないインデックスを削除してください。役立つかもしれない

他の指標は以下のとおりです。インデックスしてくださいを含む

CREATE INDEX ans1 ON answers(qid,aid); 

それとも

CREATE INDEX ans2 ON answers(aid,qid); 
+0

データベースを挿入または更新する予定はありません。これらのインデックスをテストします。 – Paul

関連する問題