SQL查询长文本字段的索引策略
AI 评分:95
文章内容实用,业务背景清晰,解决方案有效解决了长文本字段索引难题,CHECKSUM策略与哈希冲突处理细节突出,代码示例实用性强。
在查询数据库数据时,经常会想要对一个很长的文本做匹配查询,当文本长度到达几千的时候,就无法建立索引了,这时候可以增加CHECKSUM字段建立索引,从而索引匹配。
业务背景
先来说说一个现有的业务场景,公司的开票模块,通常需要对一些订单做开票处理,然而有的交易并不是只有一笔订单号,所以就要将若干的订单号组合在一起开票。在前辈的代码设计里,是直接将所有订单号以逗号分隔,放在一个字段sourceno里,随着业务的复杂化,现在最长的sourceno尽然都达到了1999字符!
又,每个交易都产生开票数据(税务局发票),开票数据和上面主单信息是以sourceno作为关联的(主单可能被删重建,但是票是实实在在存在的,重建主单时,历史票务数据应该还存在)。现在如果点击主单要查询开票数据,就得用sourceno查询,然而我们的sourceno上没有建立索引,所以查询速度比较慢。不仅如此,使用订单号查询的地方还有很多,所以整体的票务系统查询就很慢。
很快的,我们就能联想到要给sourceno建立索引,尝试添加后,却发现字段长度过长无法建立索引!
解决方案
使用一个自动计算的值,对sourceno进行 CheckSum,这样就可以得到这个OrderNum的INT数值。(CHECKSUM不仅可以只对一个字段计算,还可以对多个字段同时计算,从而进行更加复杂的索引需求)
ALTER TABLE fys_xw_ticket ADD sourceno_CS AS CHECKSUM(sourceno);然后对该字段 建立索引。
CREATE INDEX IX_fys_xw_ticket_sourceno_CS
ON fys_xw_ticket (sourceno_CS);之后查询一个订单时就可以如下查询来命中索引:
SELECT * FROM fys_xw_ticket
WHERE sourceno_CS = CHECKSUM('订单号')不过这样查询可能会产生极小概率的 哈希冲突 ,需要进一步精确查询。
SELECT * FROM fys_xw_ticket
WHERE sourceno_CS = CHECKSUM('订单号') -- 负责快速走索引定位
AND sourceno = '订单号'; -- 负责过滤哈希冲突,保证数据100%准确通过执行计划 SHOWPLAN ,我们发现就可以成功命中索引,并且快速的查询啦!

1人喜欢
💬 评论区 (0)
发表评论