`

like查询与索引

阅读更多

一.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时是不会用到索引的。一般情况下是最好不用建函数索引。

  • 大小: 2.4 KB
分享到:
评论

相关推荐

    MySQL全文索引、联合索引、like查询、json查询速度哪个快

    主要介绍了MySQL全文索引、联合索引、like查询、json查询速度大比拼,通过实例代码截图的形式给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下

    mysql中like是否使用索引

    一.测试数据  CREATE TABLE `test_orderdetail` ( `id` int(11) NOT NULL AUTO_INCREMENT, `order_id` int(11) DEFAULT NULL, `product_name` varchar(100) DEFAULT NULL, `cnt` int(11) DEFAULT NULL, ...

    MySQL第二天:查询,索引及优化

    文章目录慢查询慢查询配置慢查询解读慢查询工具mysqldumpslowpt_query_digest索引聚簇索引跟非聚簇索引聚簇索引非聚簇索引:覆盖索引(Covering Index)总结:重点执行计划执行计划详解重点 MySQL优化参考 ...

    Mysql面试过关!(详解:索引+常用引擎+常见问题+sql调优)

    3.3 模糊查询时(like语句),模糊匹配的占位符位于条件的首部 3.4 索引列参使用了函数 3.5 参数类型与字段类型不匹配,导致类型发生了隐式转换,索引失效 3.6 查询条件使用or关键字,其中一个字段没有创建索引,则...

    postgresql like模糊查询优化方案

    使用场景: 1. 要求LIKE '%xxx%'模糊查询支持索引,提高数据检索速度 2. 在上一场景的基础上,实现了对多个OR条件语句的索引查询支持

    MySQL Like模糊查询速度太慢如何解决

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

    pgsql查询优化之模糊查询实例详解

    前言 一直以来,对于搜索时模糊匹配...然后搜个简单的模糊匹配条件如 LIKE “血常规%”,可以发现查询计划生成如下,索引并没有被使用上,这是因为传统的btree索引并不支持模糊匹配 查阅文档后发现,pgsql可以在Btree

    sql学习 索引去哪儿_like与 %间一波三则的故事.sql

    sql学习 索引去哪儿_like与 %间一波三则的故事.sql

    数据库加密存储及其查询(含LIKE)中英文都支持(C#)

    通过DES加密解密算法将明文表中的信息加密存储到密文表,并对需要的属性建立...通过建立信息矩阵的方法建立索引,以支持直接对密文进行查询,将结果进行解密后再精确查询。也实现了直接全部解密然后对明文查询的方法。

    oracle like 的优化

    oracle like 的优化,使用索引、反向索引

    mysql对于模糊查询like的一些汇总

    1、常见用法: (1)搭配%使用 %代表一个或多个字符的通配符,譬如查询字段name中以大开头的数据: ...当查询的的条件和查询的结果都是索引中的字段的时候,这个索引我们可以称之为覆盖索引,这个时候,使用like模糊

    利用reverse索引优化like语句的方法详解

    主要介绍了关于利用reverse索引优化like语句的方法,文中通过图文介绍的很详细,相信对大家具有一定的参考价值,需要的朋友们下面来一起看看吧。

    Java实现一个轻量级的springboot项目索引构建工具源码,实现快速模糊搜索,使用注解即可实现索引自动创建与搜索

    本项目提供一个简单索引构建工具,使用注解即可实现索引自动创建与搜索,而不需要你手写该过程, 避免项目中大量使用like或者其他效率低的搜索机制,相比于ES(专业搜索引擎),这是一种轻量级的实现方式 特点: ...

    mysql 索引详细介绍

    mysql 索引详解: 在mysql 中,索引可以分为两种类型 hash索引和 btree索引。...比如: order_sn like ‘134%’ 这样可以使用到索引。  4.匹配范围值查询 createTime>’2015-01-09′ and createTime<‘2

    MySql数据库优化之SQL和索引的优化

    2.1like后面的通配符在前面,索引会失效。 2.2 没有使用联合索引的第一列,not in,!=,使用MySQL函数,类型转换,or等都无法用到索引。 3 SQL和索引的优化 3.1 慢查询日志 3.2 查磁盘的I/O读写的数据量 3.3 sh

    Lucene MoreLikeThis实例

    是一个开放源代码的全文检索引擎工具包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言)。Lucene的目的是为软件开发...

    thinkphp实现like模糊查询实例

    ThinkPHP可以支持直接使用字符串作为查询条件,但是大多数情况推荐使用索引数组或者对象来作为查询条件,因为会更加安全。 一、使用字符串作为查询条件 这是最传统的方式,但是安全性不高, 例如: 复制代码 代码...

    MySQL数据库经典面试题解析

    like通配符可能导致索引失效。 联合索引,查询时的条件列不是联合索引中的第一个列,索引失效。 在索引列上使用mysql的内置函数,索引失效。 对索引列运算(如,+、-、*、/),索引失效。 索引字段上使用(!= 或者 ...

    mysql面试题大全.docx

    • like通配符可能导致索引失效。 • 联合索引,查询时的条件列不是联合索引中的第一个列,索引失效。 • 在索引列上使用mysql的内置函数,索引失效。 • 对索引列运算(如,+、-、*、/),索引失效。 • 索引字段上...

Global site tag (gtag.js) - Google Analytics