我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MySQL 如何设计统计数据表

短信预约 信息系统项目管理师 报名、考试、查分时间动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

MySQL 如何设计统计数据表

目录
  • 是否需要实时更新
  • 物化视图工具(Flexviews)
  • 计数表
  • 总结

缓存型数据表通常在统计数据时会经常用到,因此也会叫统计性数据。举个例子来说,对于员工、部门数据表而言,我们可能会需要查询一个部门下有多少员工。这时候有三种方式实现:

  • 在部门下增加一个员工数量的字段,每次对员工进行增、改、删操作时都需要同步更新员工数量(如果员工换部门,则需要更新多个部门的员工数量)。这种方式能够保证实时性,但是却很低效。对于如果是操作不频繁时是没问题的,假设相当频繁,就意味着每次都需要操作两张表,而且业务代码都需要做埋点处理,将统计业务和普通业务深度耦合在一起了。
  • 每次查询的时候,从员工表中执行 SUM 函数,获取该部门的员工数。这种方式避免了埋点,但是每次都需要去员工数据表求和,如果员工数据量大的话会很低效。
  • 新建一张统计表,每隔一定时间从员工表中汇总每个部门的人员数量。这种定时抽取数据的方式会牺牲一定的实时性,但降低了代码的耦合,由于部门不会太多,这张表的大小是可预测的,也提高了数据访问的效率。这种方式即缓存型数据表。

以掘金的手机端个人中心为例,为展示每个用户的关注人数、关注者和掘力值,不可能每次查询都去做一次 SUM,这意味着需要做多张表的 SUM 操作,效率会很低,而且掘力值的计算还涉及到更为复杂的计算方法(与文章的浏览量和点赞数有关)。因此,可以猜测一下大致的表设计,这样在查询用户个人主页信息的时候只需要从这一张表就可以读取到所有数据了。


CREATE t_user_summay (
  id INT PRIMARY KEY,
  user_id BIGINT(20),
  focused_user_cnt INT,
  followed_user_cnt INT,
  user_value INT,
  user_level ENUM('Lv1', 'Lv2', ..., 'Lv8'),
  created_time DATETIME,
  updated_time DATETIME,
);

是否需要实时更新

在实际应用过程中,统计表有两种方式,一种是实时更新,一种是周期性的重建数据。两种方式有利有弊,实时更新保证了查询数据的即时性,但是会牺牲性能,并且要求代码埋点,而且由于数据更新是没有规律的,可能产生碎片。周期性的重建数据牺牲了实时性,如果说大部分数据都不变的话会带来不必要的统计计算,但如果数据经常变动,那周期性地重建数据显然会更高效而且避免了埋点的情况。当然,避免应用程序的埋点也可以通过触发器来完成,可以参考//www.jb51.net/article/213062.htm

物化视图工具(Flexviews)

在 MySQL 中,有一个 Flexviews 的开源工具用于从数据库的binlog 中提取数据完成数据统计。有点类似与视图,但与视图所不同的是,Flexviews 产生的数据表是物理表,这也是为什么称之为物化视图的原因。而且,Flexviews 还支持增量更新和全量更新。推荐使用增量更新,以避免所有行的统计数据都需要重建的情况。增量更新会检查哪些数据行数据发生了改变,再执行更新操作,相比全量更新而言性能会更高。但为了检测数据改变,需要引入一个视图记录数据行的变化日志。

计数表

在实际开发中,我们经常会需要对一些操作进行计数,比如文章的阅读数、点赞数。如果将计数值放入同一张表很可能在更新的时候出现并发问题。使用独立的计数表可以避免查询缓存失效问题并使用一些更高级的技巧。例如统计文章的阅读数、点赞数的数据表:


CREATE TABLE t_article_counter (
  article_id INT PRIMARY KEY,
  read_cnt INT UNSIGNED NOT NULL,
  praise_cnt INT UNSIGNED NOT NULL
);

在更新阅读数的时候,可以使用 MySQL 的内置加1操作:


UPDATE t_article_counter 
SET read_cnt = read_cnt + 1
WHERE article_id = 1;

这种方式可以使得操作是单行的,对事物而言是互斥的,因此会将事务序列化处理避免并发问题。但是却会影响并发请求量。可以对文章增加多个插槽来提高并发量。


CREATE TABLE t_article_counter (
  id INT NOT NULL PRIMARY KEY,
  slot TINYINT UNSIGNED,
  article_id INT,
  read_cnt INT UNSIGNED NOT NULL,
  praise_cnt INT UNSIGNED NOT NULL,
  INDEX(article_id)
);

这时可以创建100个插槽初始化数据,在更新的时候可以这样操作:


UPDATE t_article_counter
SET read_cnt = read_cnt + 1 
WHERE slot = RAND() * 100 AND article_id = 1;

获取某篇文章的总阅读数时,需要使用一个 SUM 操作:


SELECT SUM(read_cnt) FROM t_article_counter
WHERE article_id = 1;

这种方式实际上是空间换时间,提高了并发量。

总结

本篇介绍了如何设计统计数据表,关键的核心在于业务类型。对于更新频率低、数据量小的表使用实时同步或者直接 SUM 求和问题都不大。而对于大数据表,高频率的更新的情况,则可以使用独立的统计表。同时,若存在高并发的情况,统计表中可以考虑每项主体增加多个插槽的方式提高并发量。如果是周期性地同步数据,也可以使用 Flexviews 物化视图插件实现。

以上就是MySQL 如何设计统计数据表的详细内容,更多关于MySQL 设计统计数据表的资料请关注自学编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MySQL 如何设计统计数据表

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

MySQL 如何设计统计数据表

目录是否需要实时更新物化视图工具(Flexviews)计数表总结缓存型数据表通常在统计数据时会经常用到,因此也会叫统计性数据。举个例子来说,对于员工、部门数据表而言,我们可能会需要查询一个部门下有多少员工。这时候有三种方式实现:在部门下增加
2022-05-24

MySQL如何统计多张表的数据量

要统计多张表的数据量,可以使用以下MySQL语句:SELECTTABLE_NAME,TABLE_ROWSFROMinformation_schema.TABLESWHERETABLE_SCHEMA = 'your_datab
MySQL如何统计多张表的数据量
2024-04-17

MySQL数据库表设计规范

一、数据库设计 1、一般都使用 INNODB 存储引擎,除非读写比率<1%,才考虑使用 MYISAM 存储引擎;其 他存储引擎请在 DBA 的建议下使用。 2、Stored procedure (包括存储过程,函数,触发器)对于 MYSQL 来说还不是很成熟,
MySQL数据库表设计规范
2014-11-16

如何设计一个优化的MySQL表结构来实现数据统计功能?

如何设计一个优化的MySQL表结构来实现数据统计功能?在实际的软件开发中,数据统计是一个非常常见且重要的功能。而MySQL作为一种常用的关系型数据库管理系统,其表结构设计的优化对于数据统计功能的实现来说尤为重要。本文将介绍如何设计一个优化的
如何设计一个优化的MySQL表结构来实现数据统计功能?
2023-10-31

MySQL 数据库设计:点餐系统菜品表

MySQL 数据库设计:点餐系统菜品表引言:在餐饮行业中,点餐系统的设计和实现是至关重要的。其中一个核心的数据表就是菜品表,这篇文章将详细介绍如何设计和创建一个有效的菜品表,以支持点餐系统的功能。一、需求分析在设计菜品表之前,我们需要明确系
MySQL 数据库设计:点餐系统菜品表
2023-11-01

oracle如何统计表中数据条数

在 Oracle 数据库中,要统计表中的数据条数,你可以使用 COUNT 函数SELECT COUNT(*) FROM your_table_name;将 your_table_name 替换为你要查询的实际表名。这个查询将返回表中的记录
oracle如何统计表中数据条数
2024-05-09

如何设计MySQL数据库表结构以支持会计系统的核心功能?

如何设计MySQL数据库表结构以支持会计系统的核心功能?在设计会计系统的数据库表结构时,需要考虑核心功能的支持以及数据的完整性和可扩展性。本文将介绍如何设计MySQL数据库表结构来支持会计系统的核心功能,并且提供了具体的代码示例。设计会计科
如何设计MySQL数据库表结构以支持会计系统的核心功能?
2023-10-31

MySQL数据库分区表设计原则

MySQL数据库分区表设计原则涉及多个方面,以下是一些关键原则:选择合适的分区键:分区键应该是经常用于查询和筛选的字段,同时要确保分区键的数据分布均匀,避免数据倾斜。根据查询频率进行分区:将经常查询的数据放在较小的分区中,减少查询范围,加
MySQL数据库分区表设计原则
2024-10-21

java统计报表数据量大如何做

如果要处理大量的数据并生成统计报表,可以考虑以下几个方面的优化:1. 数据库优化:使用合适的索引、分区、分表等技术来提高数据库查询性能,同时确保数据库配置和参数设置合理。2. 分布式处理:将数据分布在多个节点上并行处理,可以利用分布式数据库
2023-08-24

如何设计学校管理系统的MySQL表结构?

如何设计学校管理系统的MySQL表结构?随着科技的发展,学校管理系统在教育领域起着重要的作用。设计一个高效可靠的学校管理系统需要考虑到数据库的表结构设计。MySQL是一种常用的关系型数据库管理系统,本文将介绍如何设计学校管理系统的MySQL
如何设计学校管理系统的MySQL表结构?
2023-10-31

MySQL 配置统计数据

什么是统计数据统计数据怎么存储两种存储方式:存储形式:存储的信息如何更新统计数据NULL 值如何统计参考文档什么是统计数据MySQL 为了制定执行计划收集表的相关信息,如索引行数,索引基数(不同值的数量),占用页面数等等。这些信息被称为统计数据。同一条 sql
MySQL 配置统计数据
2017-05-22

MySQL 常见的数据表设计误区汇总

目录误区一:过多的数据列误区二:过多的联合查询误区三:滥用 SET替代 ENUM误区四:生硬地避免NULL误区五:使用整数替换时间戳误区六:忘记字段的最大存储范围结语:误区一:过多的数据列MySQL 存储引擎的 API 是按照行缓冲区方式从
2022-05-13

编程热搜

目录