2012-02-15 16 views
0

私はデータベースの中の唯一のダブラーです。LEFT JOINでMySQLクエリがハングアップ

私は最近、130,000行と29,000行の2つのテーブルを扱う必要がありました。彼らは同様のデータを持っており、私はJOINステートメントのいくつかの並べ替えでそれらから引き出す必要があります。残念ながら、これは問題を引き起こすようで、クエリは座ってハングします。次のように

クエリは次のとおりです。

SELECT * 
FROM call_status LEFT JOIN queue_log 
ON call_status.callId = queue_log.callid 
ORDER BY call_status.callId DESC limit 10; 

PROCESSLISTをチェックするときに、私は以下を参照してください。

Query 643 Copying to tmp table SELECT * FROM call_status LEFT JOIN queue_log ON call_status.callId = queue_log.callid ORDER BY call 

はい、クエリが10分以上実行されています。

私はを説明し実行してきたし、これが出力IT:私は両方のテーブルの上にのSHOW INDEXを実行した

1 SIMPLE call_status ALL (null) (null) (null) (null) 28954 Using temporary; Using filesort 
1 SIMPLE queue_log ALL ix_queue_log_callid (null) (null) (null) 130419 

を、両方のは、私には罰金見える:

call_statusを:

call_status 0 PRIMARY 1 callId A 28954 (null) (null)  BTREE 
call_status 0 ix_order_callId 1 callId A 28954 (null) (null)  BTREE  

queue_log:

queue_log 1 ix_queue_log_callid 1 callid A 26083 (null) (null)  BTREE 

私は完全に失わでだし、それはここで午前2時です。

+0

を?:しますか? –

+0

'call_status.callId'に' DESC'インデックスを追加してみてください。 –

+0

@Lieven:MySQLには1種類のインデックス(ASC)しかありません。 –

答えて

2

にあなたはこれを試すことができますが、あなたのスキーマを投稿することができます

SELECT * 
FROM 
     (SELECT * 
     FROM call_status 
     ORDER BY callId DESC 
     LIMIT 10 
    ) AS st 
    LEFT JOIN 
     queue_log AS qlog 
    ON 
     st.callId = qlog.callid 
ORDER BY 
     st.callId DESC 
LIMIT 10 
+0

こんにちは。 おかげさまで、そのクエリは本当にすばやく実行されました。私はまだ結果を正確に私が望むものにするために周囲を練る必要がありますが、スピードは素晴らしいです。 なぜ速いのか、そのネストされたクエリの仕組みを少し教えてください。 ありがとうございました! – Whitey

0

サーバー側のコードでは(PHP、ASP、JSP、ルビー)は、3,4(のようになります。このすべてのIDのリストを取得し、最後の10 call_statusにその後

SELECT * FROM call_status ORDER BY callId DESC limit 10; 

を選択するようなものを試してみてください5,6,7,90)

SELECT * FROM queue_log WHERE callid IN (3,4,5,6,7,90) 

を行うと、あなたのサーバー側のコードでこれらの二つのリストに参加

またはあなたが同じことを行うために仮想テーブルを作成することができますが、データベース側