将这3个字段组合成单独的字符串列“x_y_z”(例如1231_3242_6864)并对其进行索引
使用三个整数列创建索引?
将这3个字段组合成单独的字符串列“x_y_z”(例如1231_3242_6864)并对其进行索引
使用三个整数列创建索引?
如果您可以使用覆盖索引,并且始终提供所有三个数字,因此不必担心索引顺序(请注意,这也是字符串版本中的问题),我将使用三个整数的复合索引。
这三个整数将占用更少的空间,使更多的行适合每个页面,通常在读取索引时使索引更有效。与五字节字符串99999(+/- ~2^31的四个字节)相比,您还有更多的整数头部空间。
效率的大小在数据库查询中很难判断,但请记住,您还需要组装和填充它们。不确定您计划在MySQL中如何或何处执行此操作- SQL Server具有持久化计算列,如果您要提交到字符串版本,则可能是一个很好的设计选择。
当然,我们不希望在执行连接之前将整数转换为字符串并动态连接它们。
我认为你需要自己进行基准测试(肯定还有其他因素会影响特定数据上的特定查询性能),但除了使用@mb14提出的复合三列索引的想法之外,你还可以尝试这个:
在你的表上创建一个新列,像这样:
xyzcomposite BINARY(16)
接下来,在这个列上创建你的索引。
在插入时,你需要执行一个额外的步骤,将你的字符串“x_y_z”连接起来,然后像这样插入:
INSERT INTO yourtable (...,xyzcomposite) VALUES (...,UNHEX(MD5('the_xyz_concat')));
set @xyz = UNHEX(MD5('x_y_z'));
select * from yourtable where xyzcomposite = @xyz
我不确定这种开销的总和是否值得你为了只索引一个列而获得的性能提升,相比于三个列的索引。就像我说的,你需要根据你的表格和数据进行基准测试。
编辑:这种方法的优点是它适用于任何大小的 x、y 和 z 数字。
讨论中还有一些其他相关的问题:
INT 和 VARCHAR 主键之间是否存在真正的性能差异?
从关于复合索引的问题中,其中一个答案似乎表明,如果您的 x、y 和 z 在它们自己之间趋于唯一(即大多数 x 值彼此不同,依此类推),那么您也不会得到太多的性能提升。但如果它们确实如此,那么复合索引似乎是正确的选择。
WHERE x=a AND y=b AND z=c
时,不存在值重叠或不重叠的问题,索引将非常高效。该答案是关于具有空间搜索的查询(两个范围条件),而不是3个等式条件的查询。 - ypercubeᵀᴹ