web-dev-qa-db-ja.com

FORCE INDEX mySQL ...どこに置きますか?

次のmySQLクエリがあり、完全に正常に動作します。 「FORCE INDEX」を追加する必要があることと、これをどこで行う必要があるかがわかりません。ほぼすべての場所を試してみましたが、常にmySQLエラーが表示されます。何が間違っていますか?

元のクエリは次のとおりです。

$sql_select_recent_items = $db->query("SELECT * FROM (SELECT owner_id, product_id, start_time, price, currency, name, closed, active, approved, deleted, creation_in_progress FROM db_products ORDER BY start_time DESC) as resultstable
WHERE resultstable.closed=0 AND resultstable.active=1 AND resultstable.approved=1 AND resultstable.deleted=0 AND resultstable.creation_in_progress=0
GROUP BY resultstable.owner_id
ORDER BY start_time DESC");

クエリはこのように構成されているので、疑問に思っている場合に備えて、「GROUP BY」の前に「ORDER BY」を実行できます。

追加する必要があるのは:

FORCE INDEX (products_start_time)

私はどこでも成功せずに試しましたが、それは私が見逃しているより複雑な何かがあると私を信じさせますか?

34
user2643870

インデックスヒントの構文は次のとおりです。
http://dev.mysql.com/doc/refman/5.6/en/index-hints.html

インデックスインデックスは、テーブル参照の直後に移動します。

  SELECT * FROM (
    SELECT owner_id, product_id, start_time, price, currency, name, closed, 
      active, approved, deleted, creation_in_progress FROM db_products

     FORCE INDEX (products_start_time) 

    ORDER BY start_time DESC) as resultstable
  WHERE resultstable.closed=0 
    AND resultstable.active=1
    AND resultstable.approved=1
    AND resultstable.deleted=0
    AND resultstable.creation_in_progress=0
  GROUP BY resultstable.owner_id
  ORDER BY start_time DESC

警告:

ORDER BYの前にGROUP BYを使用してowner_idごとに最新のエントリを取得している場合、MySQLの非標準で文書化されていない動作を使用しています。

MySQLの将来のバージョンで引き続き機能するという保証はありません。また、クエリは他のRDBMSでエラーになる可能性があります。

greatest-n-per-group タグを検索して、このタイプのクエリのより良いソリューションの多くの説明を探してください。

57
Bill Karwin