在 MySQL 中索引 VARCHAR

Indexing VARCHAR in MySQL

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

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

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

提前致谢。

VARCHAR() 列上的索引确实比 fixed-length 字段(如 INTBIGINT 上的索引效率稍低。但并不明显。

您希望使用第二个 table 包含文本字符串编号列表的 唯一可以想象的情况 是:您的文本字符串中不同文本字符串的数量应用程序比 table 中的行数小得多。为什么那是真的?例如,文本字符串可能是 so-called "controlled vocabulary." 中的单词。例如,音乐曲目具有 "rock"、"classical" 或 "hiphop" 等流派。在这样的应用程序中允许像 "southern california alt-surf-rock" 这样的任意类型是没有意义的。

不要想太多。请记住,数据库服务器开发人员花费了大量时间来优化其索引的性能。你几乎不可能比他们做得更好,特别是如果你必须向你的系统引入额外的 tables 和约束。

根据需要在 VARCHAR() 列上放置索引。

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

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

varchar 上的索引与 int 上的索引的性能差异小到无关紧要,除非你进入大规模(例如,数亿行的数量级)。

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

如果你达到了你认为这是瓶颈的规模,然后考虑重新设计。