在 MySQL 中存储分类字符串变量的最有效数据类型是什么

What is the most efficient Data type to store categorical string variable in MySQL

我有一个 table 大约有 50k 行和多列。 某些列的数据类型为 VARCHAR,但存储一组唯一的值,分类字符串。

我在使用此 table 时遇到了一些性能问题,因此我重构了数据类型并进行了研究,发现 SETENUM 并不比VARCHAR 因为会有查找 table 开销。

我该怎么办

我猜您所说的“分类”是指这些列具有“受控词汇表”——一组有限的可能值。

您可以做一些事情来使 table 更有效地为您服务。你不必全部做。我按难度顺序列出它们(无论如何对我来说都是困难的)。

  1. 在查询时将在 WHERE 子句中使用的列上放置索引。这样做很可能会解决您的性能问题:50k 行不是很小,而是很小。

    好的索引选择是一门艺术。查看 https://use-the-index-luke.com 了解介绍。或者,如果您遇到某些查询的性能问题,请在此处提出另一个问题。

  2. 如果可能并在必要时,用 COLLATE latin1_bin 声明这些列。这使得它们更短,并且可以更快地查找它们。如果您的分类值是阿拉伯语或其他需要 Unicode 的语言,这将不起作用。

  3. 制作一个新的table。也许称它为 category,并为 category_id 提供一个 INT UNSIGNED 列,为 category_name 提供一个 VARCHAR 列。然后,在您的 main table 中使用 INT UNSIGNED 列而不是 VARCHAR 列:将新的 table 视为查找 table,并将您的 main table 中的列视为数字引用table.

    这种方法经常用于大型(超大行)tables 以节省 RAM 和磁盘 space,并使类别的“受控词汇表”形式化。但我怀疑这对您的应用来说可能有点矫枉过正。

你对 SET 和 ENUM 的结论与我的经验相符。此外,向生产数据库中的 ENUM 添加值可能是一项非常昂贵的操作。