1. ホーム
  2. mysql

[解決済み] MySQLのFORCE INDEX - どこに入れればいいの?

2022-03-09 16:51:50

質問

以下の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");

クエリーはこのように構成されているので、私が ORDER BY の前に GROUP BY , 念のため。

追加しなければならないのは

FORCE INDEX (products_start_time)

私は、あらゆる場所でそれを試しましたが、成功しませんでした。それは、私が見逃している何かもっと複雑なものがあるのでは?

どのように解決するのですか?

の構文は インデックス のヒントは、ここに書かれています。
http://dev.mysql.com/doc/refman/5.6/en/index-hints.html

FORCE INDEX はテーブルリファレンスの直後です。

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 ではこのクエリはエラーになる可能性が高いです。

を検索してください。 最も大きいn-per-group タグに、このタイプのクエリに対するより良い解決策が多数説明されています。