首页 > 技术文章 > 高性能Mysql

hubo2 2014-01-27 12:02 原文

完全的范式化和完全的反范式化都是实验室才有的东西,实际应用中经常混用,使用部分范式化的schema,缓存表。

反范式化数据的方法:复制或者缓存,在不同的表中存储相同的特定列,可以使用触发器更新缓存值,使得实现这样的方案变得简单。

可以在user表和message表都存储account_type字段,但更新用户账户类型的操作代价就高了,需要同时更新两张表。这需要权衡,需要考虑更新的频率以及更新的时长,并和执行SELECT查询的频率进行比较。

缓存计数,如果需要显示每个用户发了多少消息,可以每次执行一个昂贵的子查询来计算,也可以在user表中建一个num_messages列,每当用户发新消息时更新这个值。

统计过去24小时内发送的消息数,每小时汇总表msg_per_hr存这个小时内发送消息数,  比如现在是2014-01-27 11:48:39  24小时内指的是从 2014-01-26 11:48:39到2014-01-27 11:48:39

先从msg_per_hr表中查 hr 在2014-01-26 12:00:00 到 2014-01-27 11:00:00之间的SUM(cnt) , 然后从message表中查2014-01-26 11:48:39到2014-01-26 12:00:00消息数

从message表中查2014-01-27 11:00:00之后的数据,三者相加

CREATE TABLE `msg_per_hr` (
  `hr` datetime NOT NULL,
  `cnt` int(10) unsigned NOT NULL,
  PRIMARY KEY (`hr`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 

推荐阅读