查看: 29282|回复: 76

[原创] 有什么办法可以提高like查询的性能?

[复制链接]
论坛徽章:
2
授权会员
日期:2005-10-30 17:05:33
跳转到指定楼层
1#
发表于 2005-6-10 08:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
表中有一个varchar2(15)的字段,客户需要对该字段进行模糊查询,而且在模糊字符串的两边都有%,结果查询速度非常慢,几十万条记录需要几分钟,

不知道有什么手段可以提高like查询的速度?请指教,谢谢!
论坛徽章:
194
红宝石
日期:2014-05-09 08:24:37萤石
日期:2014-01-03 10:25:39奥运会纪念徽章:羽毛球
日期:2008-07-01 10:46:06奥运会纪念徽章:马术
日期:2008-07-07 17:43:24奥运会纪念徽章:射箭
日期:2008-07-25 18:07:39奥运会纪念徽章:皮划艇激流回旋
日期:2008-07-30 10:02:57奥运会纪念徽章:花样游泳
日期:2008-09-26 13:02:43奥运会纪念徽章:排球
日期:2008-12-03 11:23:272010新春纪念徽章
日期:2010-01-04 08:33:082010年世界杯参赛球队:澳大利亚
日期:2010-02-26 11:08:44
2#
发表于 2005-6-10 08:10 | 只看该作者
最多使用ffs,其他没有什么好方法!

使用道具 举报

回复
论坛徽章:
2
授权会员
日期:2005-10-30 17:05:33会员2006贡献徽章
日期:2006-04-17 13:46:34
3#
发表于 2005-6-10 08:11 | 只看该作者
两边都有%,就不会走index了。。
如果表不是很大,可以考虑keep之。。

使用道具 举报

回复
论坛徽章:
44
双鱼座
日期:2016-01-07 20:57:31奔驰
日期:2013-08-02 22:22:552013年新春福章
日期:2013-02-25 14:51:24迷宫蛋
日期:2013-01-29 22:12:11蛋疼蛋
日期:2013-01-07 15:50:53ITPUB十周年纪念徽章
日期:2011-11-01 16:20:28紫蛋头
日期:2011-07-31 11:27:01蜘蛛蛋
日期:2011-06-14 14:20:33蛋疼蛋
日期:2011-06-03 19:39:27SQL大赛参与纪念
日期:2011-04-13 12:08:17
4#
发表于 2005-6-10 08:18 | 只看该作者
请贴出表结构及相关信息

使用道具 举报

回复
论坛徽章:
2
授权会员
日期:2005-10-30 17:05:33
5#
 楼主| 发表于 2005-6-10 08:26 | 只看该作者
ffs?是什么?

keep不太可能,少说也有50-60万条记录,而且记录都很大。

使用道具 举报

回复
论坛徽章:
194
红宝石
日期:2014-05-09 08:24:37萤石
日期:2014-01-03 10:25:39奥运会纪念徽章:羽毛球
日期:2008-07-01 10:46:06奥运会纪念徽章:马术
日期:2008-07-07 17:43:24奥运会纪念徽章:射箭
日期:2008-07-25 18:07:39奥运会纪念徽章:皮划艇激流回旋
日期:2008-07-30 10:02:57奥运会纪念徽章:花样游泳
日期:2008-09-26 13:02:43奥运会纪念徽章:排球
日期:2008-12-03 11:23:272010新春纪念徽章
日期:2010-01-04 08:33:082010年世界杯参赛球队:澳大利亚
日期:2010-02-26 11:08:44
6#
发表于 2005-6-10 08:34 | 只看该作者
全索引扫描。
例子:

select a,b,c from foo whee d like '%sdsds%'

建立索引包含d,a,b,c.
讲的再具体一点,将索引当作表,扫描整个索引就可以知道结果。
前提就是至少有一个字段不能为null。

使用道具 举报

回复
论坛徽章:
194
红宝石
日期:2014-05-09 08:24:37萤石
日期:2014-01-03 10:25:39奥运会纪念徽章:羽毛球
日期:2008-07-01 10:46:06奥运会纪念徽章:马术
日期:2008-07-07 17:43:24奥运会纪念徽章:射箭
日期:2008-07-25 18:07:39奥运会纪念徽章:皮划艇激流回旋
日期:2008-07-30 10:02:57奥运会纪念徽章:花样游泳
日期:2008-09-26 13:02:43奥运会纪念徽章:排球
日期:2008-12-03 11:23:272010新春纪念徽章
日期:2010-01-04 08:33:082010年世界杯参赛球队:澳大利亚
日期:2010-02-26 11:08:44
7#
发表于 2005-6-10 08:37 | 只看该作者
我想起来我们的一个程序也有这样的现象,开发人员是这样做的。

select * from foo where id in (select id from foo where name like '%ddd%' )

建立id,name索引。这样可以减少执行时间。

使用道具 举报

回复
论坛徽章:
2
授权会员
日期:2005-10-30 17:05:33
8#
 楼主| 发表于 2005-6-10 08:42 | 只看该作者
问题是like '%ddd%' ,就算有索引也用不上啊?

select * from foo where id in (select id from foo where name like '%ddd%' )

能行吗?试试看吧!我看危险。

使用道具 举报

回复
论坛徽章:
5
操作系统板块每日发贴之星
日期:2005-06-29 01:01:52ITPUB元老
日期:2005-12-16 16:57:55授权会员
日期:2005-12-16 17:08:40会员2006贡献徽章
日期:2006-04-17 13:46:342010新春纪念徽章
日期:2010-01-04 08:33:08
9#
发表于 2005-6-10 08:46 | 只看该作者
最初由 lfree 发布
[B]我想起来我们的一个程序也有这样的现象,开发人员是这样做的。

select * from foo where id in (select id from foo where name like '%ddd%' )

建立id,name索引。这样可以减少执行时间。 [/B]

这样怎么会减少执行时间,又用like又用in。

使用道具 举报

回复
论坛徽章:
3
授权会员
日期:2005-10-30 17:05:33ITPUB元老
日期:2005-11-01 07:43:48会员2006贡献徽章
日期:2006-04-17 13:46:34
10#
发表于 2005-6-10 08:46 | 只看该作者
这样的like查询肯定会用全表扫描的。
缓存不可以,就加个并行度的提示把!

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表