Performance 如何不规范连续数据(整数、浮点、日期时间等)?

Performance 如何不规范连续数据(整数、浮点、日期时间等)?,performance,database-design,database-normalization,denormalization,Performance,Database Design,Database Normalization,Denormalization,根据我的理解——如果我错了,请纠正我——“规范化”是从数据库设计中删除冗余数据的过程 然而,当我试图学习数据库性能优化/调优时,我遇到了一种建议反对规范化连续值的方法,例如(int、float、DATETIME,…) “正常化,但不要过度正常化。”特别是,不要正常化 datetimes或float或其他“连续”值 当然,纯粹主义者说时间是正常的。这是一个很大的错误。通常地 “连续”值不应标准化,因为通常 要对它们执行范围查询。如果它是标准化的,那么性能 会更糟几个数量级 正常化有几个目的;它们

根据我的理解——如果我错了,请纠正我——“规范化”是从数据库设计中删除冗余数据的过程

然而,当我试图学习数据库性能优化/调优时,我遇到了一种建议反对规范化连续值的方法,例如(int、float、DATETIME,…)

“正常化,但不要过度正常化。”特别是,不要正常化 datetimes或float或其他“连续”值

当然,纯粹主义者说时间是正常的。这是一个很大的错误。通常地 “连续”值不应标准化,因为通常 要对它们执行范围查询。如果它是标准化的,那么性能 会更糟几个数量级

正常化有几个目的;它们在这里并不真正适用:

  • 节省空间——时间戳为4字节;正火介质为3;没有多少积蓄

  • 允许更改通用值(例如在一个地方将“国际商业机器”更改为“IBM”)——此处不相关;每个 时间是独立分配的,你不是时间领主

  • 在datetime的情况下,规范化表可以有额外的列,如“星期几”、“一天中的小时”。是的,但性能仍然很好 糟透了

不要规范化“连续”值——日期、浮动等-- 特别是如果您要进行范围查询

我试图理解这一点,但我无法理解,请有人向我解释一下,并给我举一个最坏的例子,说明应用此规则将提高性能

注:我本可以在评论中问他,但我想单独记录并强调这一点,因为我认为这是一个非常重要的注释,几乎影响了我的整个数据库性能。

评论(到目前为止)正在讨论术语“规范化”的滥用。我接受这种批评。是否有一个术语来描述正在讨论的内容

让我用这个例子来阐述我的“主张”。。。一些DBA用代理ID替换
日期
;使用日期范围时,这可能会导致严重的性能问题。对比这些:

-- single table
SELECT ...
    FROM t
    WHERE x = ...
      AND date BETWEEN ... AND ...;   -- `date` is of datatype DATE/DATETIME/etc

-- extra table
SELECT ...
    FROM t
    JOIN Dates AS d  ON t.date_id = d.date_id
    WHERE t.x = ...
      AND d.date BETWEEN ... AND ...;  -- Range test is now in the other table
将范围测试移动到连接的表会导致减速

第一个查询可以通过

INDEX(x, date)
在第二个查询中,优化器(至少对于MySQL而言)将从两个表中选择一个表开始,然后对另一个表执行有点繁琐的来回操作,以处理
中的其余部分。(其他发动机采用了其他技术,但成本仍然很高。)

DATE
是可能进行“范围”测试的几种数据类型之一。因此,我声明它适用于任何“连续”数据类型(整数、日期、浮点)


即使没有范围测试,辅助表也可能没有性能优势。我经常看到一个3字节的
DATE
被一个4字节的
INT
替换,从而使主表变大!“复合”索引几乎总是能为单表方法带来更高效的查询。

你能举出一本可靠的教科书,将数据库规范化定义为用ID号替换文本吗?(不,您不能)并且规范化从不引入新属性。属性
schools.id
是新的。PS RickJames似乎不知道什么是“规范化”。他们似乎认为这与用id替换值有关。他们似乎还意味着用与其组合的值替换值,这确实与“1NF”的一些概念有关,但与更高NFs的标准化无关。无论如何,“不要规范化“连续”值”太短了,没有任何意义,甚至不清楚“连续”是什么意思,这个短语也承认,通过吓唬人的引用,它并不清楚;你需要更多地搜索他们的帖子和/或在SO帖子上给他们留下评论来解释他们的意思。“这只是ID…”这不仅仅是ID。这是一个巨大的红旗,上面写着“我不理解数据库规范化”。规范化从不引入新属性。没有所谓的“过度规范化”;只有各种标准形式1NF、2NF、BCNF等。所谓“肯定的纯粹主义者说标准化时间”,我认为这意味着用替代整数替换时间戳,这完全是胡说八道。代理id号与规范化无关。RickJames似乎不知道“规范化”是什么,“不规范化“连续”值”太短了,没有任何意义,甚至不清楚“连续”是什么意思,这个短语也承认通过恐吓引语不清楚。为什么还要问这句话是什么意思?我可以猜到是误解加上不清楚的文字导致了这句话。这是我的猜测,不是他们的意思。评论RickJames的帖子,将他们发送到这里。但不要相信他们使用的术语“正常化”。