Mysql

有效更新日誌表

  • May 23, 2021

有一個帶有復合鍵的表:

t_count

+ pageType VARCHAR(32) ascii_bin
+ pageId VARCHAR(255) utf8_bin
+ count INT

PRIMARY(pageType, pageId)

它的目的是跟踪由 ((pageType, pageId) 唯一定義的每個頁面被查看了多少次。因此查詢應該插入新行或在現有行上增加計數。如何在 MySQL 中以有效的方式進行?

該表將從為不同客戶端提供頁面的多個並發執行緒更新。因此,有效性是通過低鎖定或無鎖定以及查詢設計在高並發環境中執行的能力來衡量的。

數據庫版本為:

10.1.48-MariaDB-0+deb9u2

這就是“IODKU”(又名“upsert”)的用途:

INSERT INTO t_count
   (pageType, pageId, `count`)
   VALUES
   (?, ?, 1)
   ON DUPLICATE KEY UPDATE
       `count` = VALUES(`count`) + 1

您可以讓多個並發執行緒“同時”執行該查詢而不會出現任何問題。

縮放:如果您希望每秒增加計數器超過 100 次(如果使用 SSD,則為 1000 次),那麼我們需要討論替代方案。(劇透:我將討論http://mysql.rjweb.org/doc.php/summarytables的變體)

另一個提示:將這個 SQL 單獨放在事務中。(如果它是更大事務的一部分,它將不必要地阻塞其他執行緒。)

引用自:https://dba.stackexchange.com/questions/291989