SQL使用模糊查询like的优化

SQL使用模糊查询like的优化 SQL使用模糊查询like’%ABC’和like’%ABC%’的优化 &#1…

大家好,又见面了,我是你们的朋友全栈君。

SQL使用模糊查询like ‘%ABC’ 和 like ‘%ABC%’的优化 




编辑手记:

 今天继续学习SQL优化的技巧

感谢刘永甫专家,
本文授权转自“老虎刘谈SQL优化”。


一般情况下,sql中使用col_name like ‘ABC%‘的情况才能使用到col_name字段上的索引。那么如果是col_name like ‘%ABC%’的情况,能否使用索引呢?

答案是:可以使用索引,但是需要改写SQL并创建reverse函数索引。


具体如何实现?听专家为你揭晓。

一、col_name like ‘%ABC’时的优化方法


Test case:

    Create table t1 as select * from dba_objects;

    Create index idx_t1_objectname1 on t1(object_name);

在正常情况下,百分号在后面,可以使用索引:

select object_name from t1 where object_name like ‘DBA%’;


百分号在前面,不能使用索引:

select object_name from t1 where object_name like ‘%LIB’;

解决方法

create index idx_t1_objectname2 on t1(reverse(object_name));

select object_name from t1 where reverse(object_name) like reverse(‘%LIB’);

我们看执行计划:

SQL使用模糊查询like的优化

改写后SQL走了索引。


二、col_name like ‘%ABC%’时的优化方法

一般认为这种情况是不能使用索引的,但还是有一些优化方法可以使用。

有三种情况:

1、ABC始终从字符串开始的某个固定位置出现,可以创建函数索引进行优化

2、ABC始终从字符串结尾的某个固定位置出现,可以创建函数组合索引进行优化

3、ABC在字符串中位置不固定,可以通过改写SQL进行优化


情况1、先创建substr函数索引,再使用like ‘ABC%’。

假如ABC从字符串第五位出现:

Test Case:

create index idx_substr_t1_objname on t1 (substr(object_name,5,30));

select object_id,object_type,object_name from t1

where substr(object_name,5,30) like ‘TAB%’;

情况2、先创建reverse+substr组合函数索引,再使用like reverse‘%ABC’。

假如ABC从字符串倒数第五位出现:

Test Case:

Create index idx_t1_reverse2 on t1(reverse(substr(object_name,1,length(object_name)-4)));

select object_id,object_name,object_type from t1 

where reverse(substr(object_name,1,length(object_name)-4)) like reverse(‘%TAB_COL’);

情况3、这种情况需要like的字段上存在普通索引,主要在SQL的写法上做改进。

原来的SQL是这样写的:

Select object_id,object_type,object_name from t1

where object_name like ‘%ABC%‘;

改写后的SQL是这样的:

Select object_id ,object_type,object_name from t1 

Where object_name in

(select object_name from t1 where object_name like ‘%ABC%’);

Test Case:

create index idx_t1_object_name on t1 (object_name);

Select object_id,object_type,object_name from t1

where object_name like ‘%TABCOL%’;


此时SQL的执行计划是t1 表做全表扫描。

Select object_id,object_type,object_name from t1

Where object_name in

(select object_name from t1 where object_name like ‘%TABCOL%’);

改写后的SQL执行计划是索引全扫描加索引回表操作:

SQL使用模糊查询like的优化

优化原理

用索引全扫描取代表的全扫描。因为索引全扫描的代价是全表扫描的1/N (即索引块数与数据块数的比例),表越大,优化效果越明显。


改写后SQL的执行计划,根据索引再回表的代价要看符合条件的记录数多少:如果in子查询返回的记录数很少,那么优化的效果就相当于效率提高了N倍;如果in子查询返回的记录数较多,两种SQL的性能区别就不是很明显了。



About Me

……………………………………………………………………………………………………………….

● 本文转载自老虎刘谈SQL优化,感谢刘永甫专家的奉献

● 本文在itpub(http://blog.itpub.net/26736162)、博客园(http://www.cnblogs.com/lhrbest)和个人微信公众号(xiaomaimiaolhr)上有同步更新

● 本文itpub地址:http://blog.itpub.net/26736162/abstract/1/

● 本文博客园地址:http://www.cnblogs.com/lhrbest

● 本文pdf版及小麦苗云盘地址:http://blog.itpub.net/26736162/viewspace-1624453/

● 数据库笔试面试题库及解答:http://blog.itpub.net/26736162/viewspace-2134706/

● QQ群:230161599     微信群:私聊

● 联系我请加QQ好友(646634621),注明添加缘由

● 于 2017-05-09 09:00 ~ 2017-05-30 22:00 在魔都完成

● 文章内容来源于小麦苗的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解

● 版权所有,欢迎分享本文,转载请保留出处

……………………………………………………………………………………………………………….

拿起手机使用微信客户端扫描下边的左边图片来关注小麦苗的微信公众号:xiaomaimiaolhr,扫描右边的二维码加入小麦苗的QQ群,学习最实用的数据库技术。

SQL使用模糊查询like的优化SQL使用模糊查询like的优化

ico_mailme_02.png DBA笔试面试讲解 欢迎与我联系

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26736162/viewspace-2139039/,如需转载,请注明出处,否则将追究法律责任。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/143734.html原文链接:https://javaforall.net

(0)
上一篇 2022年5月11日 下午5:00
下一篇 2022年5月11日 下午5:00


相关推荐

  • 项目管理中wbs是什么_项目管理的wbs图的用途

    项目管理中wbs是什么_项目管理的wbs图的用途本文将项目管理的三个重要术语PBS、WBS和OBS作简要解读

    2022年8月31日
    6
  • Mac环境变量的配置

    Mac环境变量的配置Mac系统下进行PATH配置1.打开配置文件vi ~/.bash_profile2.编辑配置文件export路径名=/Users/…/PATH=$路径名:$PATH 3.保存配置文件终端:键入esc键终端:输入:wq,退出4.立即生效终端:键入source ~/.bash_profile测试配置是否成功…

    2022年6月16日
    74
  • 一篇文章读懂企业如何升级到云安全体系

    一篇文章读懂企业如何升级到云安全体系

    2022年3月6日
    46
  • 树莓派4b基础入门「建议收藏」

    树莓派4b基础入门「建议收藏」目录一、树莓派百科知识二、树莓派4B图解及配件选择三、如何烧录系统?四、树莓派开机连接五、常见警示标志和故障排除六、格式化TF卡七、系统备份与恢复八、无线WiFi上网配置九、系统汉化教程十、键盘布局设置十一、树莓派扩展分区十二、开启SSH的4种方法十三、开启VNC的3种方法十四、Windows远程桌面连接十五、获取IP和MAC地址十六、设置静态IP十七、常见问题一、树莓派百科知识树莓派(RaspberryPi)是一款基于ARM的微型电脑主板,旨为学生计算机编程教育而设计,其系统基于Linux,由注册于

    2022年6月11日
    127
  • python 生成exe文件

    python 生成exe文件在windows下,可以使用pyinstaller打包python程序为exe可执行程序。1、安装pyinstaller在cmd命令行窗口运行以下命令安装pyinstallerpipinstallpyinstaller2、打包python程序在python程序所在目录,执行以下命令#切换到指定目录cd/dpath#正常打包命令pyinstaller-F-w-iico_pathxxx.py-F是将所有文件打成一个exe文件,一般是必写的(注意必须

    2022年4月29日
    57
  • 进程间通信之CreatePipe

    进程间通信之CreatePipeCreatePipefunction创建匿名管道,返回读,写管道的handle。

    2022年7月26日
    12

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号