2010-11-20 14 views
1

私は本当に大きな問題を抱えています。これは、50k +レコードのテーブルに由来します。私はまた、別のDB(同じサーバー)上の別のテーブルを持っているこのMySQLクエリを最適化するにはどうすればよいですか?

table_1 
date | name | email | num_x | num_y 

次のようになります。

このテーブルには、(あまり重要ではありません15かそこら以上の列)は、このようになります(+1ない重要な列):

table_2 
name | comment | status 

のtable_1は、新しいエントリを繰り返し、「名前」列の多くがあることを意味し、(それは他のプロジェクトで使用するための供給テーブルである)で毎日更新されます。これは意図されたものです。 table_2には、「名前」についてのコメントとステータスノートが含まれていますが、繰り返し「名前」はありません。

私は、これはいくつかの行...

2010-11-19 | john.smith | [email protected] | 20 | 20 
2010-11-19 | joel.schmo | [email protected] | 10 | 10 
2010-11-18 | john.smith | [email protected] | 20 | 20 
2010-11-18 | joel.schmo | [email protected] | 10 | 10 
た場合、例えば、すべてのnum_x + NUM_Y> X.の合計だからのtable_1からすべての「名前」のを選択しますクエリを記述する必要が

..私は合計num_x + num_y> 50のすべての「名前」を見つける必要がありました。返信します john.smith | [email protected] | 80。他のDBからjohn.smithのステータスとコメントを返すこともできます。

私はうまく動作すると信じているクエリを書きましたが、それは永遠に実行するためには問題があります。私はまた、他のデータベースからレコードを正常に取得します(私は以下にリストされていません)。

SELECT   
    name,         
    email, 
    SUM(num_x + num_y) AS total 
FROM 
    table_1  
GROUP BY 
    name 
HAVING 
    SUM(num_x + num_y) > 100 
ORDER BY 
    total ASC 

これについては良い方法がありますか?

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

ディラン

+0

'num_x + num_y'のインデックスがありますか? – thejh

+0

私はそうではありません、正直言って私はそれがオプションであるかどうかはわかりませんでした。 :) – Dylan

答えて

1

なぜ合計を繰り返すのではなく、GHAVINGで合計を繰り返すのですか?何か不足していない限り、結果に差はなく、2番目の合計を避けて時間を節約できます。

ORDER BY句をスキップして、少し異なる選択に気をつけることができれば、合計を分割してスピードアップします。私は小さなデータベースを持っており、有効なクエリと結果が正しいとテストしましたが、パフォーマンスの差を定量化するのに十分な大きさではありません。

SELECT   
    name,         
    email, 
    SUM(num_x) as sumX, SUM(num_y) AS sumY 
FROM 
    table_1  
GROUP BY 
    name 
HAVING 
    sumX + sumY > 100 

名前のインデックスはあまりにも簡単です。それはそれをスピードアップする最も簡単なことです。

+0

私はこのアドバイスを受けて、クエリを約7%高速化しました。ご助力ありがとうございます。私はそれがかなり荒い呼び出しであるという事実に自分自身を辞めるつもりだと思うし、それは決して軽くなることはない。 :) – Dylan

+0

アドバイスのどの部分?自信を持っていることで和を避けて、自分のスピードを上げてくれるでしょう。 –

+0

私は基本的にあなたのクエリをコピーしてしまいました。最終的には、Order Byが重要だったので、私は古いクエリに戻りました。しかし、あなたが言ったように、HAVINGの合計を避けて、私は同じスピードの増加にかなり近づいています。あなたは本当に私を助けました。 – Dylan

1

試してみてください。ただ、グループ分けを取り除く

SELECT   
    name,         
    email, 
    num_x + num_y AS total 
FROM 
    table_1  
WHERE 
    num_x + num_y > 100 
ORDER BY 
    total ASC 

かなり大きな違いを作る必要があります。

+0

これは、あなたが重複する名前/電子メールレコードを提供します - 基準を満たす行ごとに1つ。 –

+0

テーブルに重複を通知していませんでした。 – RichardW1001

+0

申し訳ありませんが、ええ、かなりそれをやっていない!しかし、ありがとう! – Dylan

0

多分、xまたはyを変更するたびに合計が行われますが、実際にはそれらの変更頻度によって異なります... それ以外の場合は、一度だけ合計を実行しようとします... しかし、あなたは主キーを持っている場合にのみ、一つのテーブル上で順番を行う理由トンが見...

+0

ええと...私はこれを考慮に入れます。私は現在のところDBからしか読めるものではありませんので、このアイデアを販売するためには、このアイデアを売る必要があります。大きな違いがあると思いますか?また、応答していただきありがとうございます! – Dylan

+0

こんにちは私はそれが大きな違いを作るとは思わない。グループを削除して名前にインデックスを追加すれば十分でしょう。 – charly

1

は、名前のインデックスを作成し、これは、パフォーマンスが向上します:

ALTER TABLE `table_1` ADD INDEX (`name`); 

をしかし、あなたを再設計しますデータベースが私の推薦です。 id_nameのような名前の人工キーを作成する|名前| email、beeing id_name整数auto_incrementです。これにより、パフォーマンスが向上します。

+0

名前のインデックスを追加するとよいでしょう。 auto_incremented整数を作成するとパフォーマンスが向上しますか?このことについて私の無知を許してください。ああ、ところで、あなたの応答に感謝します! – Dylan

+0

整数よりも等しいかどうかをテキストよりも確認するほうがはるかに迅速です。テキストは文字を文字でチェックする必要があります。各文字は整数で表されます。したがって、 "john.smith"をチェックすることは、1文字あたり1つの10個の整数をチェックすることとおおよそ同じです。 – RichardW1001

関連する問題