如何基于binary类型列的前5位十六进制数进行高效范围筛选
最优方案:原生二进制范围匹配(索引友好,性能最高)
该方案不需要对查询字段做任何函数处理,可以直接命中binaryColumn上的索引,适合大数据量场景。
原理:binary(3)类型固定占3字节,对应6位十六进制字符。你需要匹配的前5位十六进制固定时,最后1位可以是0~F的任意值,因此可以直接将前5位的区间转换为完整6位十六进制的范围:
- 区间下界:前5位取最小值
00001,最后1位补最小值0,得到0x000010 - 区间上界:前5位取最大值
00012,最后1位补最大值F,得到0x00012F
查询语句如下:
SELECT * FROM myTable WHERE binaryColumn >= 0x000010 AND binaryColumn <= 0x00012F;
方案2:位移运算匹配(动态前缀场景适用,性能次之)
如果前缀是动态生成的,可以用位移运算移除最后4位二进制位(对应最后1位十六进制),直接得到前5位十六进制对应的数值做匹配,不需要做字符串转换:
SELECT * FROM myTable WHERE (binaryColumn >> 4) BETWEEN 0x00001 AND 0x00012;
注意:不同数据库的位运算语法略有差异,MySQL、PostgreSQL支持
>>右移运算符,Oracle可以用BITAND+移位函数实现,核心逻辑一致。
方案3:字符串截取匹配(仅适合小表场景)
如果需要显式获取前5位十六进制字符做匹配,可以先将二进制列转为十六进制字符串再截取,该方案无法用到索引,仅适合数据量小的场景:
以MySQL为例:
SELECT * FROM myTable WHERE LEFT(HEX(binaryColumn), 5) BETWEEN '00001' AND '00012';
内容的提问来源于stack exchange,提问作者VSB
相关产品推荐
相关产品推荐

