计数器表
如果应用在表中保存计数器则在更新计数器时可能碰到并发问题计数器表在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开发培训视频教程
数据仓库与数据挖掘培训视频教程