【问题标题】:Indexing VARCHAR in MySQLMySQL 中的 VARCHAR 索引
【发布时间】:2018-02-08 11:15:29
【问题描述】:

VARCHAR 字段的索引性能与 INT 字段相比是否相同或更差?

我有一个包含两个字段的表(两者都是 VARCHAR)。我想在第一列创建一个索引。我心里有两件事。 1.直接在第一个字段上创建索引。 2. 为第一个字段中的每个 VARCHAR 分配一个整数并将它们存储在一个表中。然后用整数替换第一列中的 VARCHAR,并在第一列上创建另一个表和索引(在这种情况下,它将是整数列)。我将在这里得到两个不同的表。

另外,如果我有 4 个或 5 个表的第一个字段相同,并且必须在每个表的第一个字段上创建索引,那么第二种方法会提供更好的性能吗?

提前致谢。

【问题讨论】:

  • 你的文本有多长?并且:您如何访问这些值?您是否查找/搜索文本?您是否曾经想按文本值对表中的数据进行排序?
  • 每个条目大约 8 个字符。我只想使用第一个字段条目搜索第二个字段。无需排序。

标签: mysql indexing query-performance sqldatatypes


【解决方案1】:

VARCHAR() 列上的索引确实比INTBIGINT 等固定长度字段上的索引效率略低。但不是很明显。

唯一可以想到的情况,您希望使用包含文本字符串编号列表的第二个表:应用程序中不同文本字符串的数量远小于行数在你的桌子上。为什么那可能是真的?例如,文本字符串可能是所谓的"controlled vocabulary." 中的单词。例如,音乐曲目具有诸如“摇滚”、“古典”或“嘻哈”之类的流派。在这样的应用程序中允许诸如“南加州 alt-surf-rock”之类的任意类型是没有意义的。

不要想太多。请记住,数据库服务器开发人员已经花费了大量时间来优化其索引的性能。您几乎不可能做得比他们做得更好,尤其是当您必须在系统中引入额外的表和约束时。

根据需要为您的VARCHAR() 列添加索引。

(另一个因素:排序规则被纳入VARCHAR() 列的索引中。如果您像您建议的那样构建自定义索引方案,则必须处理代码中的复杂性。这是众所周知的痛苦。 )

了解和讲述的有趣事实:在过去的计算时代(当时所有酷孩子都有 T1 线),系统提供了称为“原子”的对象。这些是用 ID 号引用的文本字符串。 Atoms 出现在 X Window System 中(例如)的xlib function call XInternAtom() and related functions。为什么?部分是为了节省内存和网络带宽,当时比现在更稀缺。部分出于本文前面提到的“受控词汇”的目的。

【讨论】:

  • +1 对于将文本字符串移动到查找表也很有用,如果您希望能够在一个位置更改字符串并且有许多行引用它使用新值而不会出现异常。这和你说的差不多。
【解决方案2】:

varchar 上的索引与 int 上的索引在性能上的差异足够小以至于无关紧要,除非您进行大规模(例如数亿行)。

我的建议是让您的设计简单明了。只需在索引的 varchar 上运行搜索。

如果达到您认为这是瓶颈的规模,那么请考虑在那个时候重新设计。

【讨论】:

  • 完全正确。让您的应用正常运行。如果它按比例扩大,那么您可以解决性能问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-15
  • 1970-01-01
  • 2018-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-15
相关资源
最近更新 更多