高性能MySQL:计数器表

> c slot = IF(c slot = x mslot c slot)mysql> DELETE FROM daily_hit_counter WHERE slot AND cnt = ;更快地读 更慢地写 为了提升读查询的速度 经常会需要建一些额外索引 增加冗余列 甚至是创建缓存表和汇总表 这些方法会增加写查询的负担 也需要额外的维护任务 但在设计高性能数据...
高性能MySQL:计数器表
   计数器表
  如果应用在表中保存计数器 则在更新计数器时可能碰到并发问题 计数器表在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 c cnt = IF(c slot = x mslot x cnt )
   > c slot = IF(c slot = x mslot c slot)
  mysql> DELETE FROM daily_hit_counter WHERE slot <> AND cnt = ;
  更快地读 更慢地写
  为了提升读查询的速度 经常会需要建一些额外索引 增加冗余列 甚至是创建缓存表和汇总表 这些方法会增加写查询的负担 也需要额外的维护任务 但在设计高性能数据库时 这些都是常见的技巧 虽然写操作变得更慢了 但更显著地提高了读操作的性能
  然而 写操作变慢并不是读操作变得更快所付出的唯一代价 还可能同时增加了读操作和写操作的开发难度
返回目录 高性能MySQL
编辑推荐
ASP NET MVC 框架揭秘
Oracle索引技术
ASP NET开发培训视频教程
lishixinzhi/Article/program/MySQL/201311/29673
2022-10-13
mengvlog 阅读 46 次 更新于 2025-10-29 07:20:56 我来答关注问题0
  • > c slot = IF(c slot = x mslot c slot)mysql> DELETE FROM daily_hit_counter WHERE slot AND cnt = ;更快地读 更慢地写 为了提升读查询的速度 经常会需要建一些额外索引 增加冗余列 甚至是创建缓存表和汇总表 这些方法会增加写查询的负担 也需要额外的维护任务 但在设计高性能数据...

  •  文暄生活科普 MYSQL COUNT(*) 和 COUNT(1)你真的会用吗?

    答案: 在现代MYSQL(8.0+版本)中,COUNT(*) 和 COUNT(1) 在性能上没有显著差异,它们都以相同的方式操作。详细解释:COUNT(*) 的含义:COUNT(*) 用于返回表中行的总数,无论列值是否为 NULL。对于事务性存储引擎(如 InnoDB),由于并发事务的存在,精确的行计数可能是一个挑战。InnoDB 不保存...

  •  文暄生活科普 面试官:MySQL单表过亿数据,如何优化count(*)全表的操作?

    3. MySQL 累加计数表 + 触发器 实现方式:与“MySQL 累加计数表 + 事务”类似,但使用触发器来自动更新计数表,无需在工程代码中显式处理。优点:简化了工程代码,触发器自动处理计数更新。缺点:同样存在高并发下的性能瓶颈问题,且触发器的使用可能增加数据库的复杂性。4. MySQL 增加并行线程 实现方...

  •  翡希信息咨询 特性介绍 | MySQL select count(*) 、count(1)、count(列) 详解(1):概念及区别

    总结: 在需要统计表中总行数的场景下,建议使用count或count,它们在InnoDB存储引擎中的效率没有差异。 在需要统计特定列中非NULL值行数的场景下,使用count,但需要注意其可能带来的性能损耗。 对于InnoDB表,如果需要精确计数,建议考虑其他方法,如创建计数器表或使用应用程序更新;若仅需估算行数,可以...

  •  宜美生活妙招 Mysql 知识点

    锁级别:InnoDB 支持行级锁,可以提供更高的并发性能;而 MyISAM 只支持表级锁,在高并发环境下可能导致性能瓶颈。SELECT COUNT(1) 执行方式:InnoDB 需要扫描整个表来计算行数;而 MyISAM 由于维护了一个计数器来记录表中的行数,因此可以直接读取该计数器的值。5. 常用的查询优化方法答案:常用的...

檬味博客在线解答立即免费咨询

mySQL相关话题

Copyright © 2023 WWW.MENGVLOG.COM - 檬味博客
返回顶部