これが商品テーブルの構造です。
現在、100万件以上のレコードがあります。クエリのグループ化と並べ替えを使用すると、パフォーマンスの問題が発生します。
クエリ:
SELECT product_name FROM vs_product GROUP BY store_id ORDER BY id DESC LIMIT 2
このクエリを改善してより高速に実行するにはどうすればよいですか? store_id にインデックスを付けました。ID は主キーです。
これが商品テーブルの構造です。
現在、100万件以上のレコードがあります。クエリのグループ化と並べ替えを使用すると、パフォーマンスの問題が発生します。
クエリ:
SELECT product_name FROM vs_product GROUP BY store_id ORDER BY id DESC LIMIT 2
このクエリを改善してより高速に実行するにはどうすればよいですか? store_id にインデックスを付けました。ID は主キーです。
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;
次のようなクエリが必要です。
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 が最新のものであると想定しています。
ハッキーな(しかし速い)解決策:
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 DESC
MySQL に逆順でインデックスを読み取らせます。つまり、サブクエリは各 store_id の最大 ID をフェッチします。次に、それらをテーブル全体に結合して、製品名を取得します。
クエリは、最大値を持つストア ID の 2 つの製品名をフェッチすることに注意してください。