我的数据库中的ID号码在最后3个字符中嵌入了代码。在比较这些id以获得相等时,有时可以忽略最后3个字符。
即。 12345001 == 12345009
应该是真的。
我通常使用以下where子句执行此操作:
where floor(id1/1000) == floor(id2/1000)
但是在我知道id1存储在'base'形式的情况下,其中最后3位数为零,以下也适用:
where id1 == floor(id2/1000)*1000
也可以使用子串。
问:根据经验,任何人都可以告诉我这三种方法中哪种方法最有效,或者推荐最好(最准确)的方式来分析这三种不同的查询。
感谢。
答案 0 :(得分:1)
通过函数运行任一id值将阻止任何索引使用&对整数的简单数学运算比对字符类型的强制转换更快,然后进行子字符串比较。
如果您想要完全优化它,可以添加一个计算列来派生floor(id/1000)
,然后将其编入索引并在WHERE
子句中使用它。
(另一个让你对abs(id1-id2)<1000
进行基准测试,但这样的基本数学变换系列只会对大数据集产生时间意义)