2017-07-10 21 views
0

Mysqlでクエリを最適化しようとしていますが、このクエリは0.5秒必要で、テーブルには2500行しかありません。 私は2つのテーブルを1つのテーブルは、チケットとグループ化されている他のチケットがあります。MYSQL最適化クエリ

Tickets: 
- ID : Int (Primary Key) 
- Name of the ticket: text 

GroupTickets: 
- ID : Int (Primary Key) 
- ID_relation: Int -> the id of the group of the tickets 
- ID_Ticket: Int -> the id of the ticket 

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

Select T.id, T.name, Count(GP.id_relation) 
FROM Tickets as T, GroupTickets as GP 
WHERE GP.id_relation IN (
    Select id_relation from GroupTickets 
    Where id_ticket=T.id 
) 

句は、MySQLはテーブルがこのクエリは難しいでしょう数百万行を持って、将来的にそのすべての行によって選択を行いますことを確認どこでこれを選択プロセスへ。

私は間違っていますか?誰かがこの情報を取得するより良い方法を知っていますか?チケットが他のチケットとグループ化されているかどうかを知る必要があります。

よろしくお願いいたします。

+0

変更 'IN'役に立つかもしれませんER JOIN'、おそらく 'id'にインデックスを作成することもまた必要です。 – Blank

答えて

1

以下のコメントのように

Select T.id, T.name, Count(GP.id) AS RC 
FROM Tickets as T 
INNER JOIN GroupTickets as GP ON GP.ID_TICKET = T.ID 
GROUP BY T.ID, T.name 

新しい質問のための新しいバージョン(あなたのクエリはSELECT内の冗長が...)これを試してください:あなたはこのような何かをしたいかもしれませ

SELECT A.ID, A.NAME, B.ID_RELATION, C.RC 
FROM TICKETS A 
INNER JOIN GROUPTICKETS B ON B.ID_TICKET = A.ID 
INNER JOIN (SELECT ID_RELATION, COUNT(*) AS RC 
      FROM GROUPTICKETS A 
      GROUP BY ID_RELATION) C ON C.ID_RELATION = B.ID_RELATION 
; 

も ​​`EXISTS`または` INNへ

CREATE INDEX GROUPTICKETS_IX01 ON GROUPTICKETS(ID_RELATION, ID_TICKET); 
+0

魅力的な作品! 0.5から0.0619まで。どうもありがとうございました !! – Roke

+0

@Rokeそして、ID_Ticketがインデックスされていることを確認してください – Strawberry

+0

申し訳ありません私は私のクエリで間違いを犯しました。私は同じid_relationを持つすべての行を取得する必要があります。 id_relationフィールドでは、クエリが常に1になります。 – Roke