`

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查询慢的问题

    4. **前缀索引**:如果总是对某个字段进行以固定字符串开始的LIKE查询,可以创建前缀索引,如`INDEX(field(3))`,这将加速以该固定字符串开头的查询。 5. **使用SPATIAL索引**:如果查询涉及地理位置数据,使用...

    PostgreSQL Like模糊查询优化方案

    综上所述,优化PostgreSQL中的LIKE模糊查询涉及多种策略,包括使用全文搜索、相似度查询、优化索引结构以及调整查询计划。针对具体的应用场景和数据特性,结合这些方法,可以显著提升查询效率,降低数据库的负载,...

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

    本文将深入探讨全文索引、联合索引、LIKE查询以及JSON查询这四种不同方法在实际应用中的速度比较,并通过实例进行详细解析。 首先,全文索引(Full-text Index)是MySQL提供的一种特殊类型的索引,专门用于提高全文...

    mysql各种优化

    2. LIKE查询与索引:前缀匹配(如'aaa%')可以利用索引,而通配符在开头(如'%aaa')则无法使用索引,这在设计索引和编写SQL时应予以注意。 除了以上内容,还有其他的优化策略,如合理设置数据库参数(如innodb_...

    SQL使用Like模糊查询

    `LIKE`关键字通常与`WHERE`子句一起使用,用于在查询中指定条件。一个基本的`LIKE`语句结构如下: ```sql SELECT column_name(s) FROM table_name WHERE column_name LIKE pattern; ``` 在这里,`column_name`是你...

    SQL Server 全文索引查询

    与传统的基于B树结构的索引不同,全文索引专注于处理“包含”式查询,即查询字符串中是否包含特定的关键词,而不仅仅是以特定字符开头的查询。这种技术在搜索引擎和网站搜索功能中特别有用。 首先,要启用SQL ...

    mysql多条件索引

    这意味着查询条件必须从索引的第一列开始,并按照索引列的顺序匹配,直到遇到范围查询(如`, `LIKE`等)或者中间缺失某列。例如,对于`name, age, id`的多列索引,查询条件`name='nginx.cn' and age in(15,16,17)`...

    mysql高性能索引查询(查询性能问题、索引使用原则、索引创建、索引的优点缺点).docx

    这里涉及到了“最左前缀原则”,即在使用组合索引时,查询条件必须与索引定义的字段顺序一致,并且至少包含索引的第一个字段。例如,上述索引支持如下查询: ```sql SELECT * FROM ds_order WHERE create_time = '...

    MySQL 索引最佳实践

    但是,`LIKE '%ABC'`这类查询无法通过索引来优化。 #### 设计最佳索引策略 1. **考虑查询模式**:分析应用程序中的查询模式,以确定哪些索引最有利于性能。 2. **多列索引**:当需要基于多个列进行筛选时,考虑...

    索引使用规则.txt

    群组索引与LIKE的限制 当涉及到群组索引(复合索引)时,如果其中一个字段使用了`LIKE 'XXX%'`这样的前缀匹配,那么这个索引的有效性将受到限制。具体来说,只有在群组索引的最左端字段使用前缀匹配时,索引才能被...

    MySQL索引最佳实践

    - 使用`LIKE 'abc%'`的查询可以通过索引来优化,因为它可以转化为一个闭区间查询。 - 使用`LIKE '%abc'`的查询通常无法利用索引进行优化。 #### 六、多列索引的使用 - 多列索引是指在一个索引中包含多个字段。 - ...

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

    MySQL中的LIKE操作符常用于执行模糊查询,但其性能表现往往取决于查询模式和索引的使用情况。在处理大量数据时,低效的LIKE查询可能导致显著的性能下降。以下是一些关于如何优化MySQL LIKE模糊查询的策略: 1. **...

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

    首先,理解问题的关键在于,Oracle数据库在处理`LIKE '138%'`这样的查询时可以利用索引,因为它是从已知的字符串开始进行匹配,而`LIKE '%138'`则无法利用索引,因为它是从任意位置开始匹配至已知字符串。...

    oracle like 的优化

    **问题分析**:当LIKE语句中的模式包含前导“%”,如`LIKE '%XYZ%'`时,Oracle数据库很难直接利用索引来加速查询过程。这是因为索引通常是按照升序或降序排列的,而前导“%”意味着任何以“XYZ”为子串的字符串都...

    ORACLE索引详解及SQL优化

    Oracle数据库是全球广泛使用的数据库系统之一,其性能优化的关键之一在于有效的索引设计与使用。本文将深入探讨Oracle索引的原理、创建方法,并结合SQL优化策略,帮助你提升数据库查询速度,降低资源消耗。 首先,...

    创建数据库表与索引实验.docx

    ### 创建数据库表与索引实验知识点总结 #### 一、实验背景与目标 **实验标题:** 创建数据库表与索引实验 **实验描述:** 本次实验旨在让学生掌握如何在数据库中创建表和索引,同时理解并实践数据完整性的重要性...

    MySQL索引 使用笔记

    4. 聚集索引与非聚集索引: - 聚集索引(Clustered Index)的叶子节点存储了完整的数据行,索引顺序决定了数据行的物理存储顺序。 - 非聚集索引(Secondary Index)的叶子节点存储的是主键值,通过主键值再找到...

    mysql语句集合包括模糊查询索引函数

    在这个“mysql语句集合包括模糊查询索引函数”中,我们将深入探讨SQL中的关键概念,特别是与模糊查询、索引和函数相关的知识。 首先,SQL语句主要分为四大类:SELECT(查询)、INSERT(插入)、UPDATE(更新)和...

Global site tag (gtag.js) - Google Analytics