lik模糊e查询语句,索引使用效果详解
一.like查询与索引
在oracle里的一个超级大的表中,我们的where条件的列有建索引的话,会走索引唯一扫描INDEX UNIQUE SCAN。如select * from table where code = 'Cod25',而如下这些语句哪些会走索引呢?
- select * from table where code like 'Code2%'
- select * from table where code like '%ode2%'
- select * from table where code like '%ode2'
经验证:
select * from table where code like 'Cod2%'会走索引,且走的是INDEX RANGE SCAN,而这样写like '%xxx'或'%xxx%'不会走索引,感觉就像组合索引一样,直接用索引第一个字段会走索引,而用索引第二个字段则不会走索引。
当然,如果select * from table where code like 'Cod%' 查询的结果就是所有记录,走索引和full table scaN的结果是一样的,所以也将是全表扫描。可以换成select * from table where code like 'Code2%'或者 select count(*) from table where code like 'Cod%'试试,应该不会是全表扫描。
二.优化like查询
1.经上面测试,like查询结果如下:
a.like %keyword 索引失效,使用全表扫描。但可以通过翻转函数+like前模糊查询+建立翻转函数索引=走翻转函数索引,不走全表扫描。如where reverse(code) like reverse('%Code2')
b.like keyword% 索引有效。
c.like %keyword% 索引失效,也无法使用反向索引。
2.优化like查询:
a.使用其它函数来进行模糊查询,如果出现的位置大于0,表示包含该字符串,查询效率比like要高。
1)在oracle中,可以用instr,这样查询效果很好,速度很快。
- select count(*) from table t where instr(t.code,'Cod2%') > 0
2)在mysql中,可以用locate和position函数,如table.field like '%AAA%'可以改为locate('AAA', table.field) > 0或POSITION('AAA' IN table.field)>0。
LOCATE(substr,str)、POSITION(substr IN str):返回子串 substr 在字符串 str 中第一次出现的位置。如果子串 substr 在 str 中不存在,返回值为 0。
3)在sql server中,可以给字段建立全文索引,用contains来检索数据,CONTAINS用法,可以参考:http://bijian1013.iteye.com/blog/2232872
b.查询%xx的记录
- select count(c.c_ply_no) as COUNT
- from Policy_Data_All c, Item_Data_All i
- where c.c_ply_no = i.c_ply_no
- and i.C_LCN_NO like ’%245′
在执行的时候,执行计划显示,消耗值,io值,cpu值均非常大,原因是like后面前模糊查询导致索引失效,进行全表扫描。
解决方法:这种只有前模糊的sql可以改造如下写法
- select count(c.c_ply_no) as COUNT
- from Policy_Data_All c, Item_Data_All i
- where c.c_ply_no = i.c_ply_no
- and reverse(i.C_LCN_NO) like reverse('%245')
使用翻转函数+like前模糊查询+建立翻转函数索引=走翻转函数索引,不走全扫描。有效降低消耗值,io值,cpu值这三个指标,尤其是io值的降低。
建函数索引:create index p_idx on table(instr(code,'Code2'));需进一步说明的是,这样的话,只有where instr(code,'Code2')才会走INDEX RANGE SCAN,其它如where instr(code, 'Code3')会走INDEX FAST FULL SCAN甚至TABLE ACCESS FULL。
另外,select * from table where upper(code) = 'abcD',会走TABLE ACCESS FULL。如果建函数索引create index idx_upper on table(upper(code));之后,将会是INDEX RANGE SCAN,如下所示:

PS:一般索引和函数索引的区别
1.一般的索引:
- create index P_IDX ON TABLE1(COLUMN1);
当执行SELECT * FROM TABLE1 WHERE COLUMN1 = XXX 时会用到索引。
2.函数索引:
- CREATE INDEX P_IDX ON TABLE1(SUBSTR(COLUMN1,0,5));
当执行SELECT * FROM TABLE1 WHERE SUBSTR(COLUMN1,0,5) = XXX 时会用到索引。但执行SELECT * FROM TABLE1 WHERE COLUMN1 = XXX时是不会用到索引的。一般情况下是最好不用建函数索引。
原文链接:https://blog.csdn.net/bolg_hero/article/details/77606734
lik模糊e查询语句,索引使用效果详解的更多相关文章
- 常用经典SQL语句大全完整版--详解+实例 (存)
常用经典SQL语句大全完整版--详解+实例 转 傻豆儿的博客 http://blog.sina.com.cn/shadou2012 http://blog.sina.com.cn/s/blog_84 ...
- 常用经典SQL语句大全完整版--详解+实例 《来自网络,很全没整理,寄存与此》
常用经典SQL语句大全完整版--详解+实例 下列语句部分是Mssql语句,不可以在access中使用. SQL分类: DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE) DML ...
- mysqldump的常用语句及各参数详解
mysqldump的常用语句及各参数详解 分类: MySQL 2011-01-11 17:55 1368人阅读 评论(0) 收藏 举报 数据库mysql服务器tableinsertdatabase m ...
- MySQL慢查询(二) - pt-query-digest详解慢查询日志 pt-query-digest 慢日志分析
随笔 - 66 文章 - 0 评论 - 19 MySQL慢查询(二) - pt-query-digest详解慢查询日志 一.简介 pt-query-digest是用于分析mysql慢查询的一个工具,它 ...
- Oracle创建表语句(Create table)语法详解及示例、、 C# 调用Oracle 存储过程返回数据集 实例
Oracle创建表语句(Create table)语法详解及示例 2010-06-28 13:59:13| 分类: Oracle PL/SQL|字号 订阅 创建表(Create table)语法详解 ...
- Solr系列五:solr搜索详解(solr搜索流程介绍、查询语法及解析器详解)
一.solr搜索流程介绍 1. 前面我们已经学习过Lucene搜索的流程,让我们再来回顾一下 流程说明: 首先获取用户输入的查询串,使用查询解析器QueryParser解析查询串生成查询对象Query ...
- MySQL单列索引和组合索引(联合索引)的区别详解
发现index merge局限性,优化器会自动判断是否使用 index merge 优化技术,查询还是需要组合索引[推荐阅读:对mysql使用索引的误解] MySQL单列索引和组合索引(联合索引)的区 ...
- 自定义一个更好用的SwipeRefreshLayout(弹力拉伸效果详解)(转载)
转自: 自定义一个更好用的SwipeRefreshLayout(弹力拉伸效果详解) 前言 熟悉SwipeRefreshLayout的同学一定知道,SwipeRefreshLayout是android里 ...
- ElasticSearch实战系列二: ElasticSearch的DSL语句使用教程---图文详解
前言 在上一篇中介绍了ElasticSearch集群和kinaba的安装教程,本篇文章就来讲解下 ElasticSearch的DSL语句使用. ElasticSearch DSL 介绍 Elastic ...
随机推荐
- 百度编辑器UEditor使用总结
官网下载地址:http://ueditor.baidu.com/website/download.html 我下载的是jsp版本,下载后将整个目录复制到项目的js包下,然后将jsp包下的lib下的ja ...
- PDO 的错误处理
PDO 全称 PHP Data Object ------------------ 错误处理 ------------------------- php 的 mysql 扩展对于 mys ...
- delegate operator (C# reference) and => operator (C# reference)
The delegate operator creates an anonymous method that can be converted to a delegate type: C#CopyRu ...
- Linux内核设计与实现 总结笔记(第八章)下半部和推后执行的工作
上半部分的中断处理有一些局限,包括: 中断处理程序以异步方式执行,并且它有可能打断其他重要代码的执行. 中断会屏蔽其他程序,所以中断处理程序执行的越快越好. 由于中断处理程序往往需要对硬件进行操作,所 ...
- NOIp 数学 (小学奥数)
Basic knowledge \[ C_n^m=\frac{n!}{m!(n - m)!} \] 快速幂 // Pure Quickpow inline int qpow(int n, int m, ...
- CSS3中哪些新属性—阴影、文本省略(1)
CSS3中的阴影,我知道的就是盒阴影和文字阴影.两者使用大同小异. 1.文字阴影 不知道为啥阴影会被开发出来,觉得这没啥好用啊.用了之后发现好像还行,使页面更有立体感了那么一点点.看起来趣味性强一点. ...
- 牛客提高D6t1 积木大赛
分析 每次修改用二位差分记录一下 之后对于三维分别统计即可 代码 #include<iostream> #include<cstdio> #include<cstring ...
- redhat 修改yum源
问题现象: 现有的yum安装git失败,提示yum源连接失败 Error Downloading Packages: git--.el6_4..x86_64: failure: Packages/gi ...
- swiper在vue中的用法
首先通过npm i vue-awesome-swiper --save 来在vue中下载插件 然后再main.js中引入 require('swiper/dist/css/swiper.css')im ...
- 写的一个双向链表,测试OK
#include <stdio.h> #include <stdlib.h> #include <assert.h> typedef struct DoubleLi ...