2

mysqlクエリのWhEREIN()条件に深刻な問題があります。10フィールド以下の2つのテーブルからRESULTをフェッチしています。両方にプライマリフィールドを作成しました。

500を超えるか長いlogged_inIDを表示するには、WHERE IN()を使用する必要があります。そのため、重いクエリが作成され、レコードのフェッチが遅すぎます。login_in IDが20未満の場合は問題ありませんが、50または100以上の場合は処理が遅くなり、処理に時間がかかります。

だから、私の問題はそれを速くする方法ですか?私は間違ったテクニックを使用していますか?つまり、IN()の場所の代わりに何か他のものを使用する必要がありますか?どんなアイデアでも大歓迎です。

SELECT subscriber. * , track . * 
FROM track, subscriber 
WHERE track.type =1 AND 
      track.logged_in IN ( 2803, 2806, 54, 54, 64, 383, 833, 2808, 2809, 2810, 56, 2811, 2812, 2813, 2814, 2815, 2816, 2817, 2818, 2819, 2820, 2821, 2822, 2823, 2824, 2825, 2826, 2827, 2828, 2829, 2830, 2831, 2832 ) AND 
      subscriber.post_id = track.post_id AND 
      track.nmade = subscriber.nmade AND 
      subscriber.userid =  '54' 
ORDER BY track.date_created DESC 
LIMIT 5
4

2 に答える 2

4

mysqlのIN句は、その速度で有名ではありません...必要なIDを使用して一時テーブルを作成し、トラックテーブルを使用してJOINを実行すると、操作が高速になります。

一時テーブルはセッションごとであるため、使用後にそれらを削除するために労力を費やす必要はありません。mysqlへの接続を閉じると、それらはmysqlによって削除されます。

とにかく、JOIN操作で妥当なパフォーマンスが必要な場合は、logged_inフィールドにインデックスを付ける必要があります。

于 2012-11-08T15:00:22.877 に答える
1

あなたはこのようなことを試すことができます、もっと速いはずです。これは最善の方法ではありませんが、PHPに実装するのが最も簡単な場合があります。

SELECT subscriber. * , track . * 
FROM track, subscriber
JOIN (
    SELECT 2803 as logged_in
    UNION
    SELECT 2806
    UNION
    SELECT 54
    UNION
    SELECT 64
    ) list
ON track.logged_in = list.logged_in

WHERE track.type =1 AND 
      subscriber.post_id = track.post_id AND 
      track.nmade = subscriber.nmade AND 
      subscriber.userid =  '54' 
ORDER BY track.date_created DESC 
LIMIT 5
于 2012-11-08T15:11:46.627 に答える