在 MySQL 中索引 VARCHAR

Avi*_*857 5 mysql indexing query-performance sqldatatypes

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

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

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

提前致谢。

O. *_*nes 6

列上的索引确实比固定长度字段(如or )VARCHAR()上的索引效率稍低。但情况并非如此。INTBIGINT

您想要使用包含文本字符串编号列表的第二个表的唯一可能情况是:应用程序中不同文本字符串的数量远小于表中的行数为什么这可能是真的?例如,文本字符串可能是所谓的“受控词汇表”中的单词。 例如,音乐曲目具有“摇滚”、“古典”或“嘻哈”等流派。在这样的应用程序中允许诸如“南加州另类冲浪摇滚”之类的任意流派是毫无意义的。

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

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

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

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