关于oracle模糊查询(非主键)简单分析

SQL模糊查询优化

1.单表数据量小时(<10w),建议用like语句

select t.* from t where t.name like '%123%'

2.数据量大时,建议使用instr()函数

select t.* from t where instr(t.name,'123') > 0  为查询存在此字段的数据

select t.* from t where instr(t.name,'123') = 1  为查询name开头的字段的数据

select t.* from t where instr(t.name,'123') = 0 为查询不存在此字段的数据

之所以这样做是因为之前遇到的问题。生产环境的交易表t_pay在程序进行单表查询的时候需要等待4-5分钟才会在页面显示出来。而在测试环境由于数据量不足而没有体现出问题。

t_pay的order_id字段是加了索引的,但是在模糊查询的时候使用like语句加了%貌似不通过索引,所以效率很低。而instr()函数则可以配合索引进行查询。所以使用了instr()函数。

效果待验证。

### 3.4 Oracle 加密字段的模糊查询实现方法 在 Oracle 数据库中,对加密字段实现模糊查询是一项具有挑战性的任务。由于加密后的数据通常不具备可读性,也无法直接使用 LIKE 或正则表达式进行匹配,因此需要采用特定的策略来支持模糊查询功能。 一种常见的实现方式是 **明文存储模糊查询字段**,即在数据库中同时存储加密字段和用于模糊查询的明文字段。例如,可以在表中添加一个额外字段,用于存储加密字段的部分明文信息(如分词后的关键词),并在此字段上建立索引。这种方式可以在一定程度上支持模糊匹配,但需要注意控制明文字段的访问权限,以降低安全风险。 另一种方法是 **基于分词和加密的模糊查询**,即在应用层对原始数据进行分词处理,并将每个分词后的关键词加密后存储到独立的映射表中。查询时,将用户输入的关键词进行相同的分词与加密操作,然后通过关联查询获取主表中的记录。例如: ```sql -- 假设主表为 users,模糊查询字段为 name -- 分词映射表为 name_keyword_mapping CREATE TABLE name_keyword_mapping ( user_id NUMBER, keyword VARCHAR2(100) ENCRYPT USING 'AES128' ); -- 查询时,将输入的关键词进行分词与加密后匹配 SELECT u.* FROM users u JOIN name_keyword_mapping m ON u.id = m.user_id WHERE m.keyword = f_encrypt('John'); ``` 此方法能够在不暴露原始数据的前提下实现模糊查询功能,但会增加数据存储和维护的复杂度[^4]。 此外,还可以结合 **全文搜索引擎**(如 Elasticsearch 或 Solr)来实现加密字段的模糊查询。在数据入库时,将加密字段的明文同步到搜索引擎中,并在搜索引擎中进行模糊匹配,再通过主键关联数据库中的加密数据。这种方式可以充分利用搜索引擎的文本分析能力,但需要额外部署和维护搜索服务[^1]。 对于 Oracle 本身的加密机制,如透明数据加密(TDE),由于加密和解密过程由数据库自动完成,因此无法直接对加密字段进行模糊查询。建议在这种情况下,采用虚拟列(Virtual Column)的方式,将加密字段的部分信息以可查询的形式存储,并在此列上建立索引。例如: ```sql ALTER TABLE users ADD (name_prefix AS (SUBSTR(name, 1, 3))); CREATE INDEX idx_name_prefix ON users(name_prefix); ``` 查询时可以使用相同的前缀逻辑进行匹配: ```sql SELECT * FROM users WHERE SUBSTR(name, 1, 3) = 'Joh'; ``` 此方法适用于加密字段的前缀匹配场景,但需结合业务需求进行合理设计[^2]。 总之,在 Oracle 中实现加密字段的模糊查询,需要在安全性、性能和实现复杂度之间进行权衡。根据具体业务场景选择合适的技术方案,可以有效支持模糊查询功能,同时保障数据安全。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值