在 MySQL 中存储分类字符串变量的最有效数据类型是什么
What is the most efficient Data type to store categorical string variable in MySQL
我有一个 table 大约有 50k 行和多列。
某些列的数据类型为 VARCHAR
,但存储一组唯一的值,分类字符串。
我在使用此 table 时遇到了一些性能问题,因此我重构了数据类型并进行了研究,发现 SET
和 ENUM
并不比VARCHAR
因为会有查找 table 开销。
我该怎么办
我猜您所说的“分类”是指这些列具有“受控词汇表”——一组有限的可能值。
您可以做一些事情来使 table 更有效地为您服务。你不必全部做。我按难度顺序列出它们(无论如何对我来说都是困难的)。
在查询时将在 WHERE 子句中使用的列上放置索引。这样做很可能会解决您的性能问题:50k 行不是很小,而是很小。
好的索引选择是一门艺术。查看 https://use-the-index-luke.com 了解介绍。或者,如果您遇到某些查询的性能问题,请在此处提出另一个问题。
如果可能并在必要时,用 COLLATE latin1_bin
声明这些列。这使得它们更短,并且可以更快地查找它们。如果您的分类值是阿拉伯语或其他需要 Unicode 的语言,这将不起作用。
制作一个新的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 添加值可能是一项非常昂贵的操作。
我有一个 table 大约有 50k 行和多列。
某些列的数据类型为 VARCHAR
,但存储一组唯一的值,分类字符串。
我在使用此 table 时遇到了一些性能问题,因此我重构了数据类型并进行了研究,发现 SET
和 ENUM
并不比VARCHAR
因为会有查找 table 开销。
我该怎么办
我猜您所说的“分类”是指这些列具有“受控词汇表”——一组有限的可能值。
您可以做一些事情来使 table 更有效地为您服务。你不必全部做。我按难度顺序列出它们(无论如何对我来说都是困难的)。
在查询时将在 WHERE 子句中使用的列上放置索引。这样做很可能会解决您的性能问题:50k 行不是很小,而是很小。
好的索引选择是一门艺术。查看 https://use-the-index-luke.com 了解介绍。或者,如果您遇到某些查询的性能问题,请在此处提出另一个问题。
如果可能并在必要时,用
COLLATE latin1_bin
声明这些列。这使得它们更短,并且可以更快地查找它们。如果您的分类值是阿拉伯语或其他需要 Unicode 的语言,这将不起作用。制作一个新的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 添加值可能是一项非常昂贵的操作。