VARCHAR列的良好/安全最大长度是什么,因为主键不比使用 64位系统上的MySQL 5 + InnoDB的INTEGER ID慢很多/更慢?请注意,应假设此PK由其他表引用,因此它将出现在多个JOIN中。
VARCHAR(7)会长度好吗? 6? 8? 10?更多?减?的为什么吗
可能很难回答,但至少应该基于事实的上限,例如:基于MySQL / InnoDB的内部工作原理(索引结构,......?)。
编辑:假设ASCII字符编码,区分大小写。
答案 0 :(得分:3)
对于键,通常使用int字段。几乎任何平台上都可以在一个汇编指令中比较两个数字。比较两个字符串将总是需要一个循环和额外的设置步骤,或者即使cpu内置了字符串比较指令也需要多个cpu周期。
答案 1 :(得分:2)
ASCII编码中大于VARCHAR(4)的任何内容(以及ascii_bin整理 - 您不希望对关系操作进行不区分大小写的排序规则)将比INT慢(因为INT长度为4个字节)
答案 2 :(得分:2)
VARCHAR列的最佳长度是什么? 主键不比使用MySQL 5的INTEGER ID慢很多/慢 在64位系统上+ InnoDB?请注意,应该假设这个PK 被其他表引用,因此它将出现在许多JOIN中。
做什么的慢多少?选择? UPDATE?插入?我的内部用户想要更快的插入;我的网络用户想要更快的选择。
在某种程度上,性能(无论这意味着什么)取决于您的特定数据库结构,您的特定查询模式以及您的特定服务器硬件。你自己的测试给你带来了什么?
可能很难回答,但至少应该是一个上层 基于事实的限制,例如基于MySQL / InnoDB的内部工作原理 (索引结构,......?)。
如果存在上限,即使是次要版本升级,也无法指望它保持不变。当然,查询优化器会在运行时做出决策,而不是在设计时做出决策。基于dbms内部存在的长期数据库设计决策今天不是最佳实践。 (这只是一个观察。我并不是说这是你正在做的事情,但很多读这篇文章的人都有可能做到这一点。)
如果您想知道一组特定表的执行情况,编辑问题并包含DDL是有意义的。这样我们至少在谈论同样的事情。就像现在一样,每个回答的人都可能会使用不同的结构。 (如果他们根本不愿意进行测试。)我们可能不会透露我们的私人 - 有时是无根据的 - 假设。
在一个特定情况下 - from another SO question - 使用id号和连接执行的时间是使用自然键的100倍。 (32位PostgreSQL。)因此,人们可以整天谈论比较整数或字符串所花费的CPU指令数,或整数中的字节数,或UTF-8排序规则中的字节数等等。然而,在那个具体案例中,VARCHAR(30)以压倒性优势获胜。
当我在军队时,我们有一个说法。 “当你的地图和地形不一致时,请遵循地形。”
如果理论和测量不一致,请遵循测量。从测量中制定经验法则。