【问题标题】:RDBMS normalization vs performanceRDBMS 规范化与性能
【发布时间】:2013-03-29 05:41:24
【问题描述】:

我们正在编写MMORPG 并假设我们有以下表格。 location_dynamic_objects 是要大量查询和更新的表。如您所见,position_xposition_ylocation_id 列以及对象类型都是重复的。但是,如果我们规范化并使用连接,我们将为选定的数据应用额外的过滤器。我们计划将所有location_static_objects ONCE 发送给客户,因此将它们与location_dynamic_objects 保持在一起没有任何意义。 静态对象表示要渲染的不可移动数据,并在位置加载时向客户端发送一次。动态对象代表经常更新的数据,如玩家、火箭、小行星等,并不断发送给客户端,选择取决于客户端的位置和位置。 我们的问题是我们应该放弃规范化以实现性能吗?

create table location_static_object_types (
  location_static_object_type_id integer auto_increment primary key,
  object_type_name                varchar(16) not null
);
create table location_static_objects (
  location_static_object_id      integer auto_increment primary key,
  location_static_object_type_id integer not null,
  location_id                    integer not null,
  position_x                     integer not null,
  position_y                     integer not null
);
create table location_dynamic_object_types (
  location_dynamic_object_type_id integer auto_increment primary key,
  object_type_name                varchar(16) not null 
);
create table location_dynamic_objects (
  location_dynamic_object_id      integer auto_increment primary key,
  location_dynamic_object_type_id integer not null,
  object_native_id                integer not null,
  location_id                     integer not null,
  position_x                      integer not null,
  position_y                      integer not null
);

【问题讨论】:

  • 我不确定是否会因为一两次加入而毁掉你的表现。通过适当的索引、调整,也许还有一些应用缓存,事情可能会像您需要的一样快。
  • 只有在彻底测试并有证据表明您需要恢复正常形式时,才应该进行标准化。
  • 即使我们添加索引,我们也需要过滤对象类型,重点是将未过滤的数据发送给客户端。
  • 如果添加索引必须过滤对象类型是什么意思?您的查询将如何构建?如果 WHERE 子句中有任何内容怎么办?
  • location_dynamic_objects和location_static_objects有什么区别?

标签: mysql sql performance normalization acid


【解决方案1】:

因为非规范化增加了数据的冗余,它增加了总数据量。因此,非规范化很少能提高对数据的写访问(创建和更新)的性能;反之亦然。此外,即使对于读取查询,非规范化也会牺牲一小组查询(通常只有一个)的性能提高,以降低访问非规范化数据的所有其他查询的性能。如果您为外键约束正确使用了人工主键,并辅以对自然(主)键的相应唯一性约束,如果您看到通过非规范化获得的性能提升,我会感到惊讶。

【讨论】:

  • 我总体上同意你的看法。但我不喜欢“正确规范化”涉及使用人工主键的暗示。这两件事彼此无关。
  • 我关于人工主键的说法实际上是“正确使用”,这确实会影响性能。
猜你喜欢
  • 2015-09-09
  • 2014-08-28
  • 2013-09-27
  • 2012-04-24
  • 2019-04-27
  • 1970-01-01
  • 2016-05-13
  • 2018-06-06
  • 2012-10-08
相关资源
最近更新 更多