1

ユーザーのさまざまなトランザクションを格納する 4 つの異なるテーブルがあり、特定のユーザーのすべてのトランザクションを統合したいと考えています。しかし問題は、これら 4 つのテーブルすべてに膨大な量のデータがあるため、それらすべてを UNION してユーザーと JOIN しようとすると、計算に何時間もかかることです。私がやっていることは次のとおりです。

SELECT blablabla
FROM transactions1 t1
JOIN users ON (users.id = t1.user_id AND user.state = 1 AND user.friends > 1 AND user.loc = 'Turkey')
UNION
SELECT blablabla
FROM transactions2 t2
JOIN users ON (users.id = t2.user_id AND user.state = 1 AND user.friends > 1 AND user.loc = 'Turkey')
UNION
SELECT blablabla
FROM transactions3 t3
JOIN users ON (users.id = t3.user_id AND user.state = 1 AND user.friends > 1 AND user.loc = 'Turkey')
UNION
SELECT blablabla
FROM transactions4 t4
JOIN users ON (users.id = t4.user_id AND user.state = 1 AND user.friends > 1 AND user.loc = 'Turkey')
ORDER BY date DESC

問題は、 JOIN users ON (users.id = t1.user_id AND user.state = 1 AND user.friends > 1 AND user.loc = 'Turkey')各トランザクション テーブルをユーザーと結合して、このフィルターを 4 回実行していることです。

ベスト プラクティスを実行してクエリの効率を高めるには、クエリをどのように改善すればよいですか?

ありがとう !

4

3 に答える 3

2

共通テーブル式を使用してユーザーから" user.state = 1 AND user.friends > 1 AND user.loc = 'Turkey' " を選択するか、一時テーブルに入れます。

次に、その結​​果をユニオンで使用します。

于 2013-10-25T11:09:40.750 に答える
1

次のようなことを試してみてください:

SELECT blablabla
FROM transactions1 t1, transactions2 t2,transactions3 t3,transactions4 t4
JOIN users ON (users.id = t1.user_id OR users.id = t2.user_id OR users.id = t3.user_id 
OR users.id = t4.user_id AND user.state = 1 AND user.friends > 1 AND user.loc = 'Turkey');
于 2013-10-25T11:14:48.087 に答える
0

条件付きのすべてのフィールドが INDEXED であるかどうかを確認します。(t.user_id, users: state,friends,loc) また、これを使用してみてください:

select blablabla from
(
  select * from user where user.state = 1 AND user.friends > 1 AND user.loc = 'Turkey'
) U1
join transactions1 t1 on (U1.Id=t1.User_id)

UNION ALL

select blablabla from
(
  select * from user where user.state = 1 AND user.friends > 1 AND user.loc = 'Turkey'
) U1
join transactions1 t2 on (U1.Id=t2.User_id)

UNION ALL

select blablabla from
(
  select * from user where user.state = 1 AND user.friends > 1 AND user.loc = 'Turkey'
) U1
join transactions1 t3 on (U1.Id=t3.User_id)

UNION ALL

select blablabla from
(
  select * from user where user.state = 1 AND user.friends > 1 AND user.loc = 'Turkey'
) U1
join transactions1 t4 on (U1.Id=t4.User_id)
于 2013-10-25T11:19:42.533 に答える