0

終了していないこのクエリがあります (サーバーのメモリが不足していると思います)

SELECT fOpen.*, fClose.*
FROM (
    SELECT of.*
    FROM fixtures of
        JOIN (
            SELECT MIN(id) id
            FROM fixtures
            GROUP BY matchId, period, type
        ) ofi ON ofi.id = of.id
) fOpen
JOIN (
    SELECT cf.*
    FROM fixtures cf
        JOIN (
            SELECT MAX(id) id
            FROM fixtures
            GROUP BY matchId, period, type
        ) cfi ON cfi.id = cf.id
) fClose ON fClose.matchId = fOpen.matchId AND fClose.period = fOpen.period AND fClose.type = fOpen.type

これはそれのEXPLAINです:

これら 2 つのサブクエリ「of」と「cf」を別々に実行すると、実行に約 1.5 秒かかります。

「id」は PRIMARY INDEX であり、これらの 3 つの列をこの順序で持つ「matchPeriodType」という名前の BTREE INDEX があります。

詳細: MySQL 5.5、512MB のサーバー メモリ、およびテーブルには約 400k レコードがあります。

4

2 に答える 2

1

読みやすく、インデックスを使用できるように、クエリを書き直そうとしました。私がそれを正しく理解したことを願っています、あなたのデータなしではテストできませんでした。

SELECT fOpen.*, fClose.*
FROM (
  SELECT MIN(id) AS min_id, MAX(id) AS max_id
  FROM fixtures
  GROUP BY matchId, period, type
) ids
JOIN fixtures fOpen  ON ( fOpen.id  = ids.min_id )
JOIN fixtures fClose ON ( fClose.id = ids.max_id );

これは、 (インデックスを使用する必要があります)ごとに取得MIN(id)し、後で対応する行を結合します。MAX(id)matchIdperiodtype

サブクエリはこのインデックスでのみ実行できるため、id既存のインデックスに追加するmatchPeriodTypeことも役立ちます。

于 2012-10-12T11:55:38.750 に答える
1

matchid / period / type がどの程度一意かはわかりません。一意の場合、400k レコードに対して 400k レコードを結合しており、おそらくインデックスが失われています。

ただし、2 つの主要なサブセレクトは不要なようです。それ自体に対してフィクスチャを結合し、サブセレクトに対してフィクスチャを結合して、最小値と最大値を取得できます。

于 2012-10-12T11:48:27.680 に答える