Geohash前缀匹配的高效SQL查询实现方案问询
高效实现双向前缀匹配的SQL查询方案
针对你需要的双向前缀匹配需求(要么ghash是搜索串的前缀,要么搜索串是ghash的前缀),可以用以下两种更高效的方案替代多次UNION的写法:
方案一:单条OR语句实现(写法简洁)
直接用一条SQL同时覆盖两种匹配逻辑,无需拆分多个查询:
SELECT * FROM poly WHERE -- 匹配「搜索串是ghash前缀」的记录(比如sxe0hebm5) ghash LIKE 'sxe0heb%' OR -- 匹配「ghash是搜索串前缀」的记录(比如sx、sxe0h) 'sxe0heb' LIKE CONCAT(ghash, '%');
优势:
- 无需拼接多条
UNION语句,代码简洁易维护 - 第一个条件
ghash LIKE 'xxx%'可以直接利用ghash的主键前缀索引,查询效率高 - 适用于数据量中等的场景,整体性能远优于多次
UNION
方案二:动态生成前缀+IN子句(大场景更高效)
如果数据表数据量极大,第二个条件'sxe0heb' LIKE CONCAT(ghash, '%')可能无法利用索引,可以通过程序动态生成搜索串的所有前缀,结合IN子句实现:
比如搜索串sxe0heb的所有前缀为:'s'、'sx'、'sxe'、'sxe0'、'sxe0h'、'sxe0he'、'sxe0heb',对应的SQL:
SELECT * FROM poly WHERE -- 匹配「搜索串是ghash前缀」的记录 ghash LIKE 'sxe0heb%' OR -- 匹配「ghash是搜索串前缀」的记录 ghash IN ('s', 'sx', 'sxe', 'sxe0', 'sxe0h', 'sxe0he', 'sxe0heb');
优势:
- 两个条件都能利用
ghash的主键索引,查询性能达到最优 - 程序可以通过循环截取字符串自动生成前缀列表,不管搜索串长度是1到12位,都能快速生成对应SQL,无需手动编写
结果验证
用你提供的测试数据执行上述任意方案,都会返回符合要求的三条记录:
sx(属于搜索串的前缀)sxe0h(属于搜索串的前缀)sxe0hebm5(搜索串是它的前缀)
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

