0

これが商品テーブルの構造です。
現在、100万件以上のレコードがあります。クエリのグループ化と並べ替えを使用すると、パフォーマンスの問題が発生します。 ここに画像の説明を入力

ここに画像の説明を入力

クエリ:

SELECT product_name FROM vs_product GROUP BY store_id ORDER BY id DESC LIMIT 2

このクエリを改善してより高速に実行するにはどうすればよいですか? store_id にインデックスを付けました。ID は主キーです。

4

3 に答える 3

0
SELECT x.*
   FROM my_table x
  JOIN (SELECT store_id, MAX(id) max_id FROM my_table GROUP BY store_id) y
    ON y.store_id = x.store_id
   AND y.max_id = x.id
 ORDER 
    BY store_id DESC LIMIT 2;
于 2013-01-17T08:29:15.553 に答える
0

次のようなクエリが必要です。

select p.*
from product p join
      (select store_id, max(id) as maxid
       from product p
       group by store_id
      ) psum
      on psum.store_id = p.store_id and p.id = maxid

どのテーブルにも日付がないため、最大の ID が最新のものであると想定しています。

于 2013-01-17T01:46:13.740 に答える
0

ハッキーな(しかし速い)解決策:

SELECT product_name
FROM (
  SELECT id
  FROM vs_product
  GROUP BY store_id DESC
  LIMIT 2) as ids
JOIN vs_product USING (id);

仕組み

store_id のインデックスは (store_id, id) ペアを昇順で格納します。GROUP BY DESCMySQL に逆順でインデックスを読み取らせます。つまり、サブクエリは各 store_id の最大 ID をフェッチします。次に、それらをテーブル全体に結合して、製品名を取得します。

クエリは、最大値を持つストア ID の 2 つの製品名をフェッチすることに注意してください。

于 2013-01-17T09:22:23.443 に答える