2011-05-06 25 views
0

に参加し、私は、MySQLでの2つのテーブルを持っています。MySQLのクエリの最適化

select res.TIndex, res.PNumber, res.Sender, res.Receiver, 
sta.Nickname, rta.Nickname from ((Results res join 
Nodes sta) join Nodes rta) where ((res.sender_h=sta.name) and 
(res.receiver_h=rta.name)); 

このクエリを最適化してください。現在、私はトップ5の列を引っ張りたい場合、それは約5-6分かかる。ありがとうございました。

CREATE TABLE `nodes1` (
    `NodeID` int(11) NOT NULL, 
    `Name` varchar(254) NOT NULL, 
    `Nickname` varchar(254) NOT NULL, 
    PRIMARY KEY (`NodeID`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 

CREATE TABLE `Results1` (
    `TIndex` int(11) NOT NULL, 
    `PNumber` int(11) NOT NULL, 
    `Sender` varchar(254) NOT NULL, 
    `Receiver` varchar(254) NOT NULL, 
    `PTime` datetime NOT NULL, 
    PRIMARY KEY (`TIndex`,`PNumber`), 
    KEY `PERIOD_TIME_IDX` (`PTime`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 
+0

2テーブルのSHOW CREATE TABLE出力を投稿 –

+0

クエリは有効ではありません。 –

+0

あなたはスペルミスを意味するのですか、それとももっと大きなものがありますか?私は論理的に何かが間違っているのを見ないで 'tra' vs 'rta' –

答えて

4
SELECT res.TIndex , 
     res.PNumber , 
     res.Sender , 
     res.Receiver , 
     sta.Nickname , 
     rta.Nickname 
FROM Results AS res 
     INNER JOIN Nodes AS sta ON res.sender_h = sta.name 
     INNER JOIN Nodes AS rta ON res.receiver_h = rta.NAME 
  1. ノードでのインデックス (名)
+0

+1条件を結合する 'where'節を変更し、それらのインデックスを追加することは大きな違いをもたらすはずです。私が推測しているのは、完全な結合とwhere句で、巨大なデカルト積がトリムされる前に作成されるということです。誰でもこれを確認できますか、それとも最適化されますか? –

+0

私が知る限り、JOINSとの間に実際のパフォーマンスの向上はありません。私はJOIN構文を好むだけで、意味がはっきりします。たとえば、これらは私のテーブルジョインです。これらは私のフィルタです。すべてのパフォーマンスの向上は、インデックスを追加することです。あなたは古いクエリを再試行することができ、速く実行する必要があります。 –

1

を作成

  • (sender_h)
  • は結果(receiver_h)にインデックスを作成して結果 にインデックスを作成します。 NodeId(プライマリキー)ではなく、ノードのnameに参加すると、よく見えません。

    おそらく、あなたは外部キー制約を追加する代わりにnameResultsテーブルに外部キーsenderreceiverためNodeIdを格納する必要がありますが、あまりにも良いアイデアです。とりわけ、これは、この変更が困難な場合は、インデックスが自動的に設定

    に応じて発生する可能性がありますあなたは、このようにテーブルの定義を変更した場合は非常に少なくとも、あなたはnodenameフィールド

    に一意性を強制すべきですあなたのクエリをJohnの推薦に変更して、インデックスを追加してください。インデックスを追加すると、より多くの読み込みが可能になります。