クエリで返されたテーブルのどの ID をログに記録する必要がある API があり、別のクエリでは、ID のログに基づいて並べ替えられた結果を返します。
例えば:
テーブルproducts
には と呼ばれる PK があり、 と呼ばれる PK がid
ありusers
ましたid
。返された ID ごとに 1 つの挿入/更新でログ テーブルを作成できます。性能とデザインが気になります。
基本的に、API で返された ID ごとに、次のようにします。
INSERT INTO log (product_id, user_id, counter)
VALUES (@the_product_id, @the_user_id, 1)
ON DUPLICATE KEY UPDATE counter=counter+1;
.. PK として id 列を使用するか、product_id と user_id の組み合わせを使用します (代替として、これら 2 つを UNIQUE インデックスとして使用します)。
したがって、最初の問題はこれのパフォーマンスです (20 回の挿入/更新と API での選択呼び出しへの影響)-これらの ID をログに記録するためのより良い/よりスマートな方法はありますか? ウェブサーバーのログから抽出していますか?
2 つ目は、ログに記録されたデータを含めるための select ステートメントのパフォーマンスです。これにより、ユーザーは要求ごとに新製品を表示できます (簡単な例として、実際には * の代わりにテーブル フィールドを指定します)。
SELECT p.*, IFNULL(
SELECT log.counter
FROM log
WHERE log.product_id = p.id
AND log.user_id = @the_user_id
, 0 ) AS seen_by_user
FROM products AS p
ORDER BY seen_by_user ASC
私たちのデータベースでは、products テーブルに何百万もの行があり、users テーブルは急速に拡大しています。このようにするのは正しいと思いますか、それとももっと良い方法がありますか? プロセスを最適化するにはどうすればよいですか? また、使用できるツールはありますか?