model、model_views、および model_views2 の 3 つのテーブルがあります。集約されたビューを保持するために行ごとに 1 つの列を作成するために、ビュー用の新しい列を使用して、モデルを次のように見せるための移行を行いました。
+---------------+---------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------+---------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| user_id | int(11) | NO | | NULL | |
| [...] | | | | | |
| views | int(20) | YES | | 0 | |
+---------------+---------------+------+-----+---------+----------------+
これは、model_views と model_views2 の列がどのように見えるかです:
+------------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+------------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| user_id | smallint(5) | NO | MUL | NULL | |
| model_id | smallint(5) | NO | MUL | NULL | |
| time | int(10) unsigned | NO | | NULL | |
| ip_address | varchar(16) | NO | MUL | NULL | |
+------------+------------------+------+-----+---------+----------------+
model_views と model_views2 は巨大で、どちらも合計で数千万行になります。各行は 1 つのビューを表しており、これはパフォーマンスにとってひどい混乱です。これまでのところ、この MySQL コマンドを使用して、これらの両方のテーブルの単一のビューを表すすべての行の数を取得し、model_id の合計で並べ替えました。
SELECT model_id, SUM(c) FROM (
SELECT model_views.model_id, COUNT(*) AS c FROM model_views
GROUP BY model_views.model_id
UNION ALL
SELECT model_views2.model_id, COUNT(*) AS c FROM model_views2
GROUP BY model_views2.model_id)
AS foo GROUP BY model_id
そのため、次のような素敵な大きなテーブルを取得できます。
+----------+--------+
| model_id | SUM(c) |
+----------+--------+
| 1 | 1451 |
| [...] | |
+----------+--------+
SUM(c) の値を model.views 列にマージし、上記の SQL クエリから取得した model.id と model_ids を一致させるために、ここからコマンドを引き出すための最も安全なルートは何でしょうか? まだ存在するモデルの行のみを入力したい - 削除されたモデル テーブルの行を参照している model_views がある可能性があります。