众所周知,使用 like 进行模糊查询速度极差,包括 like 'AAA%' ,like '%AAA',like '%AAA%',like '%A%A%'以及采用“_”进行单字符匹配的那些模糊查询。网上有很多文章讲到如何提高like查询,提到 like 'AAA%'能够使用到索引,而like '%AAA' ,使用创建反向函数的索引来提高查询效率。但一般情况下,是无法约定客户端采用哪种like查询,难道说把所有的这些情况都进行if判断吗?

为这个事情脑袋疼了无数次。最近,一客户“无理”要求对用户地址模糊查询速度太慢。在数十万的用户记录下查询,要求5秒之内必须查询到记录。

想破脑袋还是找不到方法。有同事找了本Lucene的书给我看,说是能解决。翻来覆去的看了2,3遍,始终想不出这玩意儿怎么用。

突然想到oracle也有全文索引一说,以前只是别人提起过这个词。与网上朋友一聊,说是似乎可以解决,但他忘了怎么用了。

半夜12点,赶紧爬起来,到google上查资料。还真有两下子,研究了几个小时,有所获。第二天白天没时间研究,晚上继续,最终把全文索引搞定,解决了模糊查询速度慢的问题,在数十万条用户数据中, 对用户地址进行模糊查询速度在2秒以内就能够查到。

-------------------------------------------------------------------------

以下是创建全文索引的方法(网上有文章提到使用图形化界面,我用图形化界面创建全文索引,创建了一个晚上,第二天起床居然还没完。但用SQL命令15分钟左右就搞定):

对cmng_custominfo 表中的address字段做全文检索:
1,在oracle9201中需要创建一个分词的东西:

BEGIN
ctx_ddl.create_preference ('SMS_ADDRESS_LEXER', 'CHINESE_LEXER');
--ctx_ddl.create_preference ('my_lexer', 'chinese_vgram_lexer'); 不用
end;

2,创建全文检索:

CREATE INDEX INX_CUSTOMINFO_ADDR_DOCS ON cmng_custominfo(address) INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS ('LEXER SMS_ADDRESS_LEXER');

3,查询时候,使用:

select * from cmng_custominfo where contains (address, '金色新城')>1;

自己测试,发现select * from cmng_custominfo where contains (address, '%金色新城%')>1;才能实现模糊查询,并且使用了索引,数据库版本为oracle9.0.1.1.1

4,需要定期进行同步和优化:
同步:根据新增记录的文本内容更新全文搜索的索引。

begin
ctx_ddl.sync_index('INX_CUSTOMINFO_ADDR_DOCS');
end;

优化:根据被删除记录清除全文搜索索引中的垃圾

begin
ctx_ddl.optimize_index('INX_CUSTOMINFO_ADDR_DOCS', 'FAST');
end;

5,采用job做步骤4中的工作:

1)该功能需要利用oracle的JOB功能来完成
因为oracle9I默认不启用JOB功能,所以首先需要增加ORACLE数据库实例的JOB配置参数:
job_queue_processes=5
重新启动oracle数据库服务和listener服务。

2)同步 和 优化
--同步 sync:
variable jobno number;
BEGIN
DBMS_JOB.SUBMIT(:jobno,'ctx_ddl.sync_index(''INX_CUSTOMINFO_ADDR_DOCS'');', SYSDATE, 'SYSDATE + (1/24/4)');
 commit;
END;

--优化
variable jobno number;
begin
 DBMS_JOB.SUBMIT(:jobno,'ctx_ddl.optimize_index(''INX_CUSTOMINFO_ADDR_DOCS'',''FULL'');', SYSDATE, 'SYSDATE + 1');
 commit;
END;

其中, 第一个job的SYSDATE + (1/24/4)是指每隔15分钟同步一次,第二个job的SYSDATE + 1是每隔1天做一次全优化。具体的时间间隔,可以根据应用的需要而定

6,索引重建
重建索引会删除原来的索引,重新生成索引,需要较长的时间。
重建索引语法如下:
ALTER INDEX INX_CUSTOMINFO_ADDR_DOCS REBUILD;

据网上一些用家的体会,oracle重建索引的速度也是比较快的,有一用家这样描述:

Oracle 的全文检索建立和维护索引要比ms sql server都要快得多,笔者的65万记录的一个表建立索引只需要20分钟,同步一次只需要1分钟。
因此,也可以考虑用job的办法定期重建索引。

参考资料:
1,http://blog.csdn.net/yurenjia/archive/2007/04/08/1556306.aspx
2,http://topic.csdn.net/u/20080117/23/34004f4a-4989-47ef-8764-0b7e3bf737a7.html
3,http://tenwe.com/tech/database/oracle/200702/content_561_4.shtml
4,http://www.knowsky.com/389357.html
5,http://yangtingkun.itpub.net/post/468/195520
6,http://bbs.zdnet.com.cn/archiver/tid-120474.html
7,http://bbs.违规广告.com/archiver/tid-26270.html
8,http://oracle.**.com/exploiture/720104_3.html
9,http://www.33kuai.cn/html/shujuku/20080126/5314_2.html
10,http://www.xrss.cn/Dev/DataBase/20084218963.Html

采用全文索引解决模糊查询速度慢的问题相关推荐

  1. oracle模糊查询很慢,采用全文索引解决模糊查询速度慢的问题

    众所周知,使用 like 进行模糊查询速度极差,包括 like 'AAA%' ,like '%AAA',like '%AAA%',like '%A%A%'以及采用"_"进行单字符匹 ...

  2. MySQL 用全文索引解决模糊查询

    点击下方"IT牧场",选择"设为星标" 前言 我们都知道 InnoDB 在模糊查询数据时使用 "%xx" 会导致索引失效,但有时需求就是如此 ...

  3. oracle 模糊查询_MySQL Like模糊查询速度太慢如何解决

    问题:明明建立了索引,为何Like模糊查询速度还是特别慢? Like是否使用索引? 1.like %keyword 索引失效,使用全表扫描.但可以通过翻转函数+like前模糊查询+建立翻转函数索引=走 ...

  4. mysql解决模糊查询包含关系

    mysql解决模糊查询包含关系 后台要根据期限筛选查询时如果用like, SELECT * from t_user_accord_invest t where t.invest_period like ...

  5. 解决模糊查询问题 element UI 从服务器搜索数据,输入关键字进行查找

    解决模糊查询问题 element UI 从服务器搜索数据,输入关键字进行查找 参考文章: (1)解决模糊查询问题 element UI 从服务器搜索数据,输入关键字进行查找 (2)https://ww ...

  6. oracle锁表查询_专业解决 MySQL 查询速度慢与性能差

    Java识堂,一个高原创,高收藏,有干货的微信公众号,一起成长,一起进步,欢迎关注 什么影响了数据库查询速度 1.1 影响数据库查询速度的四个因素 1.2 风险分析 QPS: QueriesPerSe ...

  7. 专业解决 MySQL 查询速度慢与性能差!

    作者:唐立勇 https://segmentfault.com/a/1190000013672421 什么影响了数据库查询速度 1.1 影响数据库查询速度的四个因素 1.2 风险分析 QPS: Que ...

  8. MyBatis 解决模糊查询包含特殊字符

    第一块:MyBatis 实现模糊查询方式 1.1 sql中字符串拼接 SELECT * FROM 表名 WHERE 字段名 LIKE CONCAT(CONCAT('%', #{参数}), '%'); ...

  9. 大牛出招|分分钟解决 MySQL 查询速度慢与性能差

    点击▲关注 "数据和云"   给公众号标星置顶 更多精彩 第一时间直达 作者:唐立勇 https://segmentfault.com/a/1190000013672421 一.什 ...

最新文章

  1. 人工智能改善客户服务体验
  2. android ViewPager 实现点击小圆点切换页面 案例
  3. Android使用腾讯浏览服务X5内核
  4. P4592 [TJOI2018]异或 (可持久化Trie)
  5. OpenShift 4 - 通过 REST API 操作 OpenShift
  6. debian安装中文字体
  7. bzoj1396 识别子串
  8. java使用itext7生成pdf
  9. 中国农村统计年鉴合集(1985-2019年)
  10. FGSM攻击机器学习模型
  11. pc机箱 图纸_如何升级到新的PC机箱
  12. 经纬度(度分秒)和十进制相互转换
  13. excel两个指标相关性分析_相关系数excel-如何用spss做相关性分析
  14. VScode设置目录分级显示
  15. ​极飞无人机IPO申请获受理!主打农业应用,西安电子科技大学校友创立,高瓴百度是股东...
  16. pycharm 运行celery_调试celery遇到的坑
  17. 英特尔Atom处理器出货一亿,庆祝上网本CPU三周岁
  18. eclipse设置代码格式化(详解)
  19. 1到n的数按字典序排序
  20. 对于中小企业,如何管理好仓库?

热门文章

  1. Linux Rootkit 系列五:感染系统关键内核模块实现持久化
  2. Centos 7.0设置/etc/rc.local无效问题解决
  3. DLL延迟加载工程分析
  4. Ubuntu命令行下安装,卸载软件包的过程
  5. XenStore: 使用,结构和原理
  6. c++ 缓存和缓冲_【嵌入式C】放弃printf,选择了精简snprintf
  7. 英雄探长的机器人怎么拼_LOL路人局都畏惧的辅助英雄,新版机器人布里兹上手指南...
  8. html lt table 设置数据,vue_+_element_ui_动态添加table数据
  9. 利用单调栈判断二叉搜索树的后序遍历序列
  10. matlab 多维数组储存,多维数组 - MATLAB 系统中文帮助手册