2016-03-18 9 views
0

この次の問合せ文では、2つの質問があります。まず、これはクロス結合ではなく内部結合であるか、パフォーマンスの違いがないかです。第二に、これをより速くするためにインデックスをどうすればよいでしょうか?各列に対して1つの索引を作成するのか、またはすべての列の複数の索引を作成するのか、あるいはその両方を行うのですか?結合に関するクエリの適切な索引付け

SELECT  *, 
      a.id AS auction_id, 
      ab.id AS autobid_id 
FROM  auctions a 
CROSS JOIN autobids ab 
on   ab.auction_id = a.id 
AND  ab.bids > 0 
AND  ab.user_id != a.user_bid_id 
WHERE  a.status = 'active' 
AND  a.end_time BETWEEN $now AND  $future 
AND ab.start_price <= (a.bid_count /100) 
+0

テーブルサイズがわからないので試してみる必要があります。 MySQLのインデックス[** TIPS **](http://mysql.rjweb.org/doc.php/index_cookbook_mysql) –

+0

パフォーマンスに関する質問には、 'EXPLAIN ANALYZE'と、テーブルのサイズ、インデックス、現在の時間のパフォーマンス、欲望の時間に関するいくつかの情報「遅い」は相対的な項であり、比較するためには真の値が必要です。 [MySQL](http://dba.stackexchange.com/questions/15371/how-do-i-get-the-execution-plan-for-a-view) –

答えて

0

あなたがON句を持っている場合、あなたは、テーブル間の任意の関連する条件なしでフルクロス積をやっている時にのみ使用すべきであること、CROSS JOINを使用しないでください。関連条件がある場合は、内部結合または外部結合を使用する必要があります。また、ON句には、2つのテーブルに関連する条件(子テーブルの条件もON句に属する外部ジョインを除く)のみが含まれている必要があります。 MySQLは実際にINNER JOINと同等のものとしてCROSS JOINを扱います。したがって、あなたはエラーなしで書いたものを許可しますが、標準のSQLは許可しません。文法的には、CROSS JOINと書くと、条件なしで参加していると宣言する必要があるので、ONという句を持つのは混乱します。

必要なインデックスは、実際にはデータの性質によって異なります。しかし、一般的なルールでは、結合を最適化するためにテーブルごとに1つのインデックスしか使用できないため、複合インデックスを使用して複数のカラムをフィルタリングできるようにする必要があります。したがって、クエリには、少なくとも(auctions.user_bid_id, auctions.id)(autobids.auction_id, autobids.user_id)のような複合インデックスが必要で、おそらくauctions.status,auctions.end_time、および/またはautobids.bids列にも追加する必要があります。多くの異なるインデックスのメモリオーバーヘッドと、追加する検索の利点とのバランスをとる必要があります。また、インデックスが多すぎるとリターンが低下する可能性があります。

関連する問題