Mysql:将多个整型字段合并为一个字符串字段?

Mysql:将多个整型字段合并为一个字符串字段?,mysql,performance,Mysql,Performance,假设我有一个包含数百万行的表,其中有3个整数变量:x、y和z,我在一个SELECT中进行搜索。。。其中x=a,y=b,z=c 哪个更快/更高效 将这三个字段组合成一个单独的字符串列“x_y_z”(例如1231_3242_6864)并对其编制索引 对三个整数建立三列索引 不,这将是最糟糕的,字符串比较要慢得多。您最终可以(如果真的需要,我不推荐)将3个整数合并为一个整数,但前提是它们合适 但是,要解决索引问题,最简单的方法是在x、y和z上创建一个复合索引。我认为您确实需要自己对其进行基准测试(当

假设我有一个包含数百万行的表,其中有3个整数变量:x、y和z,我在一个SELECT中进行搜索。。。其中x=a,y=b,z=c

哪个更快/更高效

  • 将这三个字段组合成一个单独的字符串列“x_y_z”(例如1231_3242_6864)并对其编制索引

  • 对三个整数建立三列索引


不,这将是最糟糕的,字符串比较要慢得多。您最终可以(如果真的需要,我不推荐)将3个整数合并为一个整数,但前提是它们合适


但是,要解决索引问题,最简单的方法是在x、y和z上创建一个复合索引。

我认为您确实需要自己对其进行基准测试(当然还有其他因素将决定您对特定数据的特定查询的性能),但是除了使用@mb14提出的复合3列索引的想法之外。你可以试试这个:

在表上创建一个新列,如下所示:

xyzcomposite BINARY(16)
INSERT INTO yourtable (...,xyzcomposite) VALUES (...,UNHEX(MD5('the_xyz_concat')));
然后,在此列上创建索引

在插入时,您需要执行一个额外的步骤来连接字符串“x_y_z”,然后像这样插入:

xyzcomposite BINARY(16)
INSERT INTO yourtable (...,xyzcomposite) VALUES (...,UNHEX(MD5('the_xyz_concat')));
当然,您还需要在select语句之前运行哈希算法

set @xyz = UNHEX(MD5('x_y_z'));
select * from yourtable where xyzcomposite = @xyz
我不确定这项开销的总和是否值得您看到的仅索引这一列而不是三列索引所带来的性能提升。就像我说的,您必须根据您的表和数据对其进行基准测试


编辑:这种方法的优点是它适用于任意大小的x、y和z数字。

还有一些其他问题与当前讨论相关:


从关于综合指数的问题来看,这似乎表明,如果x、y和z在它们之间趋于唯一(即大多数x值彼此不同,等等),那么无论如何,性能不会有多大提升。但是如果他们这样做了,复合索引似乎是一条出路。

如果你可以有覆盖索引,并且总是提供所有三个数字,因此不必担心索引中的顺序(注意,这也是字符串化版本中的一个问题),我会使用三个整数的复合索引

这三个整数将占用更少的空间,使每页可以容纳更多的行,这通常会使索引在读取时更有效。与99999的五字节字符串(+/-~2^31的四个字节)相比,该整数的净空也要大得多

在数据库查询中很难判断效率的大小,但请记住,您还必须组装和填充这些数据。不确定您计划在MySQL中如何或在何处执行此操作-SQL Server保留了计算列,如果您要提交字符串版本,这可能是一个很好的设计选择


当然,在执行联接之前,不希望将整数转换为字符串并将其动态连接。

每个整数的最大值是多少?为了在此进行讨论,假设每个存储大小为50000,三个
无符号SMALLINT
字段总共需要6个字节,而像
12345\u 67890\u 24680
这样的字符串可能需要17个字节。同样的原则也适用于索引的RAM使用。有些方面可以调整,但在我的3密耳快速测试。行,一个字符串表是130 MB数据/170 MB索引,而三个Int表是97 MB数据/76 MB索引。这是一个简单的问题:3列和复合索引。不能将整数组合成一个大列。想象一下(x=1,y=3,z=5)和(x=5,y=1,z=3)这两种情况,它们加起来的值是相同的,但意义却大不相同。不,你不把它们加起来,但例如x,y,z=3,5,7,结果将是300005000007。这就是为什么我问你的尺寸integers@Ekoo当然,您不需要添加它们,但您可以按照Sebas所说的那样(或以二进制方式移动它们),但这取决于每个元素的最大大小。这就是我所说的“如果它们适合”@Ekoo一列索引可能比3一更好,但3整数的组合可能更好,也更省事。非常正确,我猜在95%以上的情况下,3整数组合就足够了。没有重叠或没有值的问题,当查询为
时,其中x=a、y=b和z=c
索引将是有效的。这个答案是关于一个带有空间搜索的查询(两个范围条件),而不是3个相等条件。值的重叠可能不是我要寻找的精确短语,也许x、y和z的唯一性更准确。基本上,这个想法是索引只有在多个x=a时才有帮助,以此类推。当然,如果表中的所有行都有x=a、y=b和z=c,那么索引就没有多大帮助:)这是索引的“选择性”(关于查询参数)。这与索引是否有用以及是否被使用有关。但这与你的答案无关。