計數器表
如果應用在表中保存計數器則在更新計數器時可能碰到並發問題計數器表在Web 應用中很常見可以用這種表緩存一個用戶的朋友數文件下載次數等創建一張獨立的表存儲計數器通常是個好主意這樣可使計數器表小且快使用獨立的表可以幫助避免查詢緩存失效並且可以使用本節展示的一些更高級的技巧
應該讓事情變得盡可能簡單假設有一個計數器表只有一行數據記錄網站的點擊次數
問題在於對於任何想要更新這一行的事務來說這條記錄上都有一個全局的互斥鎖(mutex)這會使得這些事務只能串行執行要獲得更高的並發更新性能也可以將計數器保存在多行中每次隨機選擇一行進行更新這樣做需要對計數器表進行如下修改
然後預先在這張表增加 行數據現在選擇一個隨機的槽(slot)進行更新
如果希望減少表的行數以避免表變得太大可以寫一個周期執行的任務合並所有結果到 號槽並且刪除所有其他的槽
mysql> UPDATE daily_hit_counter as c
> INNER JOIN (
> SELECT day SUM(cnt) AS cnt MIN(slot) AS mslot
> FROM daily_hit_counter
> GROUP BY day
> ) AS x USING(day)
> SET ccnt = IF(cslot = xmslot xcnt )
> cslot = IF(cslot = xmslot cslot)
mysql> DELETE FROM daily_hit_counter WHERE slot <> AND cnt = ;
更快地讀更慢地寫
為了提升讀查詢的速度經常會需要建一些額外索引增加冗余列甚至是創建緩存表和匯總表這些方法會增加寫查詢的負擔也需要額外的維護任務但在設計高性能數據庫時這些都是常見的技巧雖然寫操作變得更慢了但更顯著地提高了讀操作的性能
然而寫操作變慢並不是讀操作變得更快所付出的唯一代價還可能同時增加了讀操作和寫操作的開發難度
返回目錄高性能MySQL
編輯推薦
ASPNET MVC 框架揭秘
Oracle索引技術
ASP NET開發培訓視頻教程
數據倉庫與數據挖掘培訓視頻教程
From:http://tw.wingwit.com/Article/program/MySQL/201311/29673.html