私はMySqlデータベースで作業しています。ここでは、複数の(10以上の)表を単一の表にマージする必要があります。これを行うために、私は典型的な参加スタイルに従っています。複数の結合でSQLクエリの実行をスピードアップするには?
Select * from
table_1
Join table_2
on(table_1.id = table_2.id)
Join table_3
on(table_1.id = table_3.id)
実行時には大変です。私のコードを最適化する他の良い方法はありますか?以下の私のコードのサンプルです:
SELECT
distinct
u.Id,
oc.dt,
Daily_Number_Outgoing_Calls,
Daily_Number_Incoming_Calls,
Daily_duration_Outgoing_Calls
FROM
creditfix.users u
JOIN
#1 Daily_No_Out_Calls
(
SELECT
cl.uId,SUBSTRING(DATE,1,10) as dt,
count(1) as Daily_Number_Outgoing_Calls
From creditfix.call_logs as cl
WHERE
cl.`type`=2 #out going calls only
GROUP by cl.uId,dt
) oc
ON (u.Id=oc.Uid)
#2 Daily_No_In_Calls
JOIN
(
SELECT
cl.uId, SUBSTRING(DATE,1,10) as dt,
count(1) as Daily_Number_Incoming_Calls
From creditfix.call_logs as cl
WHERE
cl.`type`=1 #incoming calls only
GROUP by cl.uId,dt
) ic
ON (u.Id=ic.Uid)
#3 Daily_duration_Out_Calls
JOIN
(
SELECT
cl.uId,SUBSTRING(DATE,1,10) as dt,
(sum(duration)) as Daily_duration_Outgoing_Calls
From creditfix.call_logs as cl
WHERE
cl.`type`=2 #out going calls only
GROUP by cl.uId,dt
) od
ON (u.Id=od.uid)
# It goes on like this...
'GROUP BY'の中で名前の代わりに列番号を使用する習慣から抜け出すために、クエリを読みにくくしています。 – Barmar
'SELECT'リストに列を挿入した場合に、コードを編集すると壊れやすくなります。 – Barmar
パフォーマンスの問題は、テーブルを結合するだけでなく、サブクエリを結合しようとしているためです。これらは実際のテーブルのようなインデックスを持っていないので、MySQLが最適化するのは難しいです。 – Barmar