ロックがポストテーブルに保持される時間を最小限に抑えるために、結果を一時テーブルに事前集計してから更新を実行することができます。一例として、
:一時テーブルでカウントして
DROP TEMPORARY TABLE IF EXISTS `__post_last_day_counts__`
;
CREATE TEMPORARY TABLE `__post_last_day_counts__`
(post_id BIGINT NOT NULL COMMENT 'pk'
, likes_last_day BIGINT NOT NULL
, views_last_day BIGINT NOT NULL
, PRIMARY KEY (post_id)
) ENGINE=InnoDB
;
INSERT INTO `__post_last_day_counts__`
(post_id
, likes_last_day
, views_last_day
)
SELECT p.post_id
, IFNULL(lc.likes_last_day,0) AS likes_last_day
, IFNULL(vc.views_last_day,0) AS views_last_day
FROM post p
LEFT
JOIN (SELECT pl.post_id
, COUNT(pl.post_id) AS likes_last_day
FROM post_like pl
WHERE pl.date > ('$current_date' - INTERVAL 1 DAY)
) lc
ON lc.post_id = p.post_id
LEFT
JOIN (SELECT pv.post_id
, COUNT(pv.post_id) AS views_last_day
FROM post_view pv
WHERE pv.date > ('$current_date' - INTERVAL 1 DAY)
) vc
ON vc.post_id = p.post_id
;
、我々はポストのテーブルを更新することができます...
UPDATE post t
JOIN `__post_last_day_counts__` s
ON s.post_id = t.id
SET t.likes_last_day = s.likes_last_day
, t.views_last_day = s.views_last_day
;
とクリーンアップ...
DROP TEMPORARY TABLE IF EXISTS `__post_last_day_counts__`
;
全体的にはおそらくが遅いですが、時間t UPDATE文はロックを保持します。
注:テンポラリテーブルのpost_id
カラムのデータタイプは、テーブルのpost_id
のデータタイプと一致する必要があります。私はちょうど推測した。
post_id
がポストテーブルの主キー(または一意のキー)であると仮定しています。
... on post_view (post_id, date)
... on post_like (post_id, date)
使用すると、操作が実行されていると、どのインデックスが使用されている実行計画を、見にEXPLAIN:
は、適切なインデックスが利用可能であることを確認してください。 (「Extra」列の「Using index for group」を参照してください)
これらの列のいずれかにインデックスがありますか? –
phpMyAdminでクエリを実行し、開始時(つまりUPDATE前)にEXPLAINを追加します。あなたの質問をこちらからの出力で更新してください。 – Chris