假设我有一个包含数百万行的表,其中我有3个整数变量:x,y和z,我在SELECT中搜索... WHERE x = a和y = b和z = c
哪个会更快/更有效?
将3个字段组合成单独的字符串列“x_y_z”(例如1231_3242_6864)并将其编入索引
针对三个整数制作3列索引?
答案 0 :(得分:2)
不会是最糟糕的,字符串比较慢得多。你最终可能(如果真的需要,我不推荐它)将3个整数组合在一个整数中,但只有如果它们适合。
但是,要解决索引问题,最简单的问题是在x,y和z上创建复合索引。
答案 1 :(得分:1)
如果你可以覆盖索引,并且总是提供所有三个数字,那么就不用担心索引中的顺序(注意这也是字符串化版本中的一个问题),我会使用三者的综合索引整数。
三个整数将占用更少的空间,每页更多的行适合,这通常使索引在读取时更有效。与99999的5字节字符串(+/- ~2 ^ 31的4字节)相比,您在该整数中还有更多的余量。
在数据库查询中很难判断效率的大小,但请记住,您还必须组装和填充这些。不确定你计划在MySQL中做到这一点的方式或地点 - 如果你要提交字符串版本,SQL Server会保留计算列,这可能是一个很好的设计选择。
当然,在执行连接之前,人们不希望将整数转换为字符串并在运行中连接它们。
答案 2 :(得分:0)
我认为您确实需要自己进行基准测试(肯定会有其他因素决定您的特定数据的特定查询的性能),但除了使用复合3列索引的想法之外@ MB14。你可以试试这个:
在您的桌子上创建一个新列,如下所示:
xyzcomposite BINARY(16)
然后,在此列上创建索引。
在插入时,您需要执行额外的步骤以连接到字符串“x_y_z”,然后插入如下:
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数字。
答案 3 :(得分:0)
还有一些其他问题与手头的讨论有关:
Indexing Performance BigInt vs VarChar
Is there a REAL performance difference between INT and VARCHAR primary keys?
When should I use a composite index?
关于复合索引的问题,one of the answers似乎表明如果你的x,y和z之间往往是唯一的(即大多数x值彼此不同,等等),无论如何,你不会获得太大的性能提升。但如果他们这样做,复合指数似乎就好了。