【问题标题】:Using alpha-numeric keys to JOIN tables and in WHERE conditions在 WHERE 条件下使用字母数字键来 JOIN 表
【发布时间】:2014-07-08 13:32:58
【问题描述】:

所以我有这个数据库,其中许多表都有一个 auto-increment numeric ID record_id 和一个 surrogate unique hash field record_hash record_hash record_hash primary key

我看到在很多地方,JOINSWHERE 条件都写在record_hash 上。我的问题是 - 这会比 record_id 字段慢。仅JOIN 或两者JOIN and WHERE 是否存在差异?

【问题讨论】:

  • 对于 InnoDB 存储引擎 - 与唯一键相比,使用主键执行每次查找(JOIN、WHERE 等)都会更快。对于 TokuDB 等引擎,如果唯一键也是集群索引 - 我认为性能将是相同的。

标签: php sql performance join where-clause


【解决方案1】:

速度实际上是由查询和表上的索引决定的。如果查询中使用的两列都有相似的索引,那么性能将是相似的。唯一的小区别是数字 id 会更小,读取和比较会更快一些。

通常,在设计数据库时,您只需要一个唯一的 ID。记录散列只会增加不必要的开销。我会尽可能坚持使用 id。

【讨论】:

  • 您所写的内容并非在所有情况下都是正确的,尤其是在您使用 InnoDB 的情况下。 PK vs surrogate = PK 获胜,在读取性能方面有很大优势。有大量关于 InnoDB 和集群的文章,我建议你阅读它们。
  • @N.B.为什么你认为这是 InnoDB?它只是标记为 sql,所以我给出了一个通用的答案。
  • 我很抱歉,是我错误地假设这是标记为 mysql。但是,您所说的内容是正确的,除非主键用于集群并且代理不是因为这改变了关于如何读取记录的低级实现 - 使用 1 I/O 与使用 2 I/可悲的是,Os 并不是一个边际差异。
  • @N.B.伙计们,我应该是那个道歉的人。我已将其标记为 sql,希望获得更广泛的受众。事实上,我正在使用 InnoDB。您的两位 cmets 都给了我很好的洞察力。
  • 除非您直接使用主键,否则每次连接/位置都会产生额外的 I/O。要“感受”差异,请将innodb_buffer_pool 降低到一个较小的值,以强制 InnoDB 完全使用 HDD,并将通过代理查询时发生的情况与 PK 进行比较。
猜你喜欢
  • 2011-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-10
相关资源
最近更新 更多