2

私は以下のコードを持っており、テーブルに数follower_id個しかない場合でも正常にロードされます。 しかし、数千になるとすぐに、読み込みが非常に遅くなります。 これを書く良い方法はありますか?usernametblfollowers

結合するフィールドにインデックスを追加しましたが、違いはないようです。

$scheduler->render_table("events 
    LEFT JOIN tblfollowers ON events.id_user = tblfollowers.username 
    WHERE events.status ='active' 
      AND((tblfollowers.follower_id)='$test') OR ((events.id_user) ='$test') 
    GROUP BY events.event_id, events.event_name, events.user_name, events.id_user, events.time, events.details, events.location, events.dresscode 
    ORDER BY events.timestamp DESC"
  ,"event_id","start_date, start_date,event_name,details");
$scheduler->render_sql("SELECT event_id, start_date, end_date, event_name, details 
                        FROM events ");

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

1 SIMPLE イベント ALL NULL NULL NULL NULL 1593 where; の使用。一時的な使用; ファイルソートの使用    
1 SIMPLE tblfollowers ref PRIMARY PRIMARY   
4 dbhappps.events.id_user 17 where を使用します。インデックスの使用     

ここにテーブルがあります

引用符

テーブル イベント:

event_id   int(11)  Primary Unique Index    
event_name varchar(400) 
user_name  varchar(155)  
id_user int(11)  Primary Unique  Index
start_date datetime
end_date  datetime   
details varchar(700)
location varchar(255)
dresscode varchar(255)
timestamp timestamp on update CURRENT_TIMESTAMP

引用符

tblフォロワー:

username int(11) primary
follower_id int(11) primary
timestamp timestamp on update CURRENT_TIMESTAMP

このクエリを高速化するにはどうすればよいですか?

4

4 に答える 4

2

必要なフィールドは 2 つだけですgroup by(フィールドevent_idが主キーの場合は、そのフィールドのみが必要です
。group by を使用して考慮されるフィールドを減らすと、クエリが高速になります。機能的に独立したフィールド
のみをgroup by に配置し、機能的に依存するリストにする必要があります。幸い なことに、MySQL ではこれを行う必要はありません。

$scheduler->render_table("events  
   LEFT JOIN tblfollowers ON events.id_user = tblfollowers.username 
   WHERE events.status ='active' 
     AND '$test' IN (tblfollowers.follower_id, events.id_user) <<-- maybe faster
   GROUP BY events.event_id, events.id_user   <<-- only include unique key fields
   ORDER BY events.timestamp DESC"
,"event_id","start_date, start_date,event_name,details");
$scheduler->render_sql("SELECT event_id, start_date, end_date, event_name, details 
                        FROM events ");

詳細については、こちらをご覧ください: http://rpbouman.blogspot.com/2007/05/debunking-group-by-myths.html

なぜ遅いのですか?
tblfollowers とイベントのテーブル定義がないと、わかりにくいです。


ボトルネックがどこにあるかを確認したい場合は、explain を使用EXPLAINして、select の前に を置き、結果を質問に貼り付けます。

$scheduler->render_sql("EXPLAIN SELECT event_id, start_date, end_date, event_name, details 
                        FROM events ");

インデックスを追加しても役に立たない
からの出力を使用しexplainて決定を通知し、インデックスを追加すると挿入と更新が遅くなり、ディスク使用量が肥大化します。

于 2013-10-09T00:41:50.800 に答える
1

完全開示: 私は PHP を知りません。

ただし、クエリを分割して、 を使用して元に戻すようにしてUNIONください。ORインデックスの使用を防止することで、パフォーマンスが低下していると思います。あなたのクエリは、PHPの外では次のように見えると思います。

SELECT event_id
     , start_date
     , end_date
     , event_name
     , details 
  FROM events
  LEFT JOIN tblfollowers 
    ON events.id_user = tblfollowers.username 
 WHERE events.status ='active' 
   AND tblfollowers.follower_id = '$test'
UNION
SELECT event_id
     , start_date
     , end_date
     , event_name
     , details 
  FROM events
 WHERE id_user = '$test'
于 2013-10-16T22:09:00.970 に答える