MySQL:VAR的大小和PK一样快和INT一样快吗?

时间:2011-08-09 21:23:49

标签: mysql performance primary-key innodb varchar

VARCHAR列的良好/安全最大长度是什么,因为主键不比使用 64位系统上的MySQL 5 + InnoDB的INTEGER ID慢很多/更慢?请注意,应假设此PK由其他表引用,因此它将出现在多个JOIN中。

VARCHAR(7)会长度好吗? 6? 8? 10?更多?减?的为什么吗

可能很难回答,但至少应该基于事实的上限,例如:基于MySQL / InnoDB的内部工作原理(索引结构,......?)。

编辑:假设ASCII字符编码,区分大小写。

3 个答案:

答案 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)以压倒性优势获胜。

当我在军队时,我们有一个说法。 “当你的地图和地形不一致时,请遵循地形。”

如果理论和测量不一致,请遵循测量。从测量中制定经验法则。