`
zzc1684
  • 浏览: 1213814 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

模糊查询与索引

阅读更多

通配符(%)在搜寻词首出现,一般会导致Oracle系统不使用索引。因此,要尽量避免在模糊查询中使用通配符开头,或者是开头结尾都有通配符,这样会导致降低查询速度。

 

--创建一个name字段的索引

 

create index IDX_B$L_INTEREST_INFO_NAME on B$L_INTEREST_INFO (NAME);

 

    以下语句不能使用name字段索引:

 

select * from b$l_interest_info where name like '%瑞德工业园%';

 

2 ----------------------------------------------------------------------------

 

3 | Id | Operation         | Name              | Rows | Bytes | Cost (%CPU)|

 

4 ----------------------------------------------------------------------------

 

5 |   0 | SELECT STATEMENT |                   |   141K| 8139K| 5426   (4)|

 

6 |   1TABLE ACCESS FULL| B$L_INTEREST_INFO |   141K| 8139K| 5426   (4)|

 

7      ----------------------------------------------------------------------------

 

如果遇到模糊查询的例子,尽量将通配符放在末尾,以常量开头,那么可以使用上索引,如下语句所示:

 

select * from b$l_interest_info where name like '瑞德工业园%';

 

2       -----------------------------------------------------------------------------------------------

 

3       | Id | Operation                   | Name                       | Rows | Bytes | Cost (%CPU)|

 

4       -----------------------------------------------------------------------------------------------

 

5       |   0 | SELECT STATEMENT            |                            | 1278 | 75402 |   360   (1)|

 

6       |   1TABLE ACCESS BY INDEX ROWID| B$L_INTEREST_INFO          | 1278 | 75402 |   360   (1)|

 

7       |   2 |   INDEX RANGE SCAN          | IDX_B$L_INTEREST_INFO_NAME | 1278 |       |     6   (0)|

 

8       -----------------------------------------------------------------------------------------------

 

 

 

如果必须将通配符放在开头,以常量结束,那么可以创建一个反向键索引

 

--在name字段创建一个反向键索引

 

create index idx_interest_info_name_re on b$l_interest_info(reverse(name));

 

analyze table b$l_interest_info compute statistics for table for all indexes;

 

--没有用到反向键索引

 

select * from b$l_interest_info where name like '%瑞德工业园';

 

2      ----------------------------------------------------------------------------

 

3      | Id | Operation         | Name              | Rows | Bytes | Cost (%CPU)|

 

4      ----------------------------------------------------------------------------

 

5      |   0 | SELECT STATEMENT |                   |   141K| 8139K| 5426  (4)|

 

6      |   1TABLE ACCESS FULL| B$L_INTEREST_INFO |   141K| 8139K| 5426   (4)|

 

7      ----------------------------------------------------------------------------

 

 

 

因此,要使用反向键索引还必须加上reverse关键字

 

--用上了反向键索引IDX_INTEREST_INFO_NAME_RE

 

select * from b$l_interest_info where reverse(name) like reverse('%瑞德工业园');

 

2       ----------------------------------------------------------------------------------------------

 

3       | Id | Operation                   | Name                      | Rows | Bytes | Cost (%CPU)|

 

4       ----------------------------------------------------------------------------------------------

 

5       |   0 | SELECT STATEMENT            |                           |   141K| 8139K| 5233   (1)|

 

6       |   1TABLE ACCESS BY INDEX ROWID| B$L_INTEREST_INFO         |   141K|  8139K| 5233   (1)|

 

7       |   2 |   INDEX RANGE SCAN          | IDX_INTEREST_INFO_NAME_RE | 25429 |       |    77   (2)|

 

8       ----------------------------------------------------------------------------------------------

 

 

 

如果开头结尾都要用到通配符,且select获取的字段只有该模糊查询字段,则可以用上索引:

 

--用到了name字段的一般索引IDX_B$L_INTEREST_INFO_NAME

 

select name from b$l_interest_info where name like '%瑞德工业园%';

 

2       ----------------------------------------------------------------------------------------

 

3       | Id | Operation            | Name                       | Rows | Bytes | Cost (%CPU)|

 

4       ----------------------------------------------------------------------------------------

 

5       |   0 | SELECT STATEMENT     |                            |   141K| 1379K| 1915   (7)|

 

6       |   1INDEX FAST FULL SCAN| IDX_B$L_INTEREST_INFO_NAME |   141K| 1379K| 1915   (7)|

 

7       ----------------------------------------------------------------------------------------

但是对于使用%%这种查询且select获取的字段包含了模糊查询字段以外的,就很难用上索引了。

分享到:
评论

相关推荐

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

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

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

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

    PostgreSQL Like模糊查询优化方案

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

    Mysql 时间模糊查询

    ### MySQL 时间模糊查询详解 #### 一、概述 在数据库操作中,经常需要对时间进行模糊查询以满足特定业务需求。MySQL提供了多种方法来进行时间模糊查询,这些方法各有特点,适用于不同的场景。本文将详细介绍几种...

    ASP.NET MVC数据库模糊查询

    对于模糊查询,通常我们会在`Controller`中处理用户的输入,然后通过`Model`与数据库进行交互。在C#中,我们可以使用Linq(Language Integrated Query)来实现这个功能。Linq提供了一种在C#代码中直接编写查询数据库...

    完整JSP模糊查询完整JSP模糊查询

    1. **SQL模糊查询**:在JSP中进行模糊查询,实质上是通过后台的Java代码与数据库交互,利用SQL语句中的LIKE关键字来实现。LIKE关键字配合通配符(如`%`)可以匹配任意字符,例如`WHERE column LIKE '%关键词%'`。 2...

    ComBoBoxEditTest实现模糊查询

    例如,可以使用懒加载策略,只在必要时进行匹配,或者预先对数据进行处理,生成一个索引结构以加速查询。 5. **用户体验**:除了功能实现,还需要考虑用户体验。例如,设置合适的提示信息,限制同时显示的匹配项...

    全表模糊查询

    为了提高查询速度,可以考虑创建索引,特别是对于经常用于模糊查询的字段。同时,合理设计数据库结构和优化查询语句也是提高效率的关键。 7. **实际应用**: 模糊查询在很多场景下都很有用,如用户在搜索框输入...

    android 模糊查询

    在实际开发中,为了提高用户体验,我们还应考虑对查询性能的优化,如建立索引、限制查询结果数量、分页显示等。同时,根据用户输入动态调整查询策略,比如在用户输入较少字符时,先进行全拼匹配,随着输入增多,逐渐...

    C# DataGridView分页以及模糊查询实现

    此外,用户可能还需要进行模糊查询来快速找到所需信息。在这个主题中,我们将探讨如何在C#的`DataGridView`中实现这两种功能,并与SQL数据库进行交互。 首先,让我们了解`DataGridView`的分页实现。在C#中,我们...

    sqlite 支持中文模糊查询

    对于大量数据和频繁的模糊查询,考虑创建全文索引或使用全文搜索引擎(如SQLite的FTS模块)可能会更高效。 总的来说,现代SQLite版本已经具备了支持中文模糊查询的能力,只要正确配置字符集并注意相关编码问题,就...

    模糊查询所需组件

    在模糊查询场景下,layui可以与后端API配合,实现在表格数据的实时搜索。 具体实现步骤可能包括: 1. **创建前端表单**:使用layui的form模块创建一个包含输入框的表单,用户在输入框内输入模糊查询的关键词。 2. ...

    模糊查询的例子

    这些组件提供了与SQL的接口,使得在DELPHI应用中构建和执行模糊查询变得简单。 5. **用户界面设计**:在描述的示例中,用户界面(UI)会逐步收集用户的查询条件。这可能包括输入框、下拉菜单或其他控件,让用户指定...

    j2ee+ssi模糊查询

    - **使用索引**:为数据库表的查询字段创建索引可以显著提高模糊查询的速度,特别是对于大型数据集。 - **避免全表扫描**:尽量避免使用通配符开头的模糊查询(如`%keyword`),这会导致全表扫描,性能较低。如果...

    分页+模糊查询(简单易学)

    在实际应用中,分页与模糊查询经常结合使用。例如,在一个电商网站的搜索功能中,用户可能希望输入关键词(模糊查询)并按页查看结果。在这种情况下,开发者需要考虑如何高效地执行模糊查询,同时结合分页策略,确保...

    Nhibernate的模糊查询

    全模糊查询(如`'%关键词%'`)很难利用到索引,应尽量避免。如果必须使用,考虑使用全文搜索引擎如Lucene.NET或SOLR与Nhibernate集成。 3. **分页查询** 对于大数据量的模糊查询,记得使用分页,避免一次性加载...

    参照工具数据库数据多列模糊查询

    总之,“参照工具数据库数据多列模糊查询”涉及的关键技术包括SQL模糊查询语法、索引优化、全文检索以及数据库查询工具的使用。理解这些概念和技巧,将有助于我们在处理大量数据时更有效地进行信息检索。

    根据电话号,姓名模糊查询通讯录

    本教程将深入探讨如何实现"根据电话号,姓名模糊查询通讯录"这一功能。这个功能允许用户通过输入部分电话号码或姓名,就能找到相应的联系人信息,提高了用户体验。 首先,我们需要了解Android系统的通讯录访问机制...

    VFP模糊查询课程设计

    7. **实际应用与优化**:在实际场景中,模糊查询可能会涉及到性能优化,比如索引的使用、查询条件的组合等。虽然对于初学者来说这可能较复杂,但了解这些概念有助于提升查询效率。 8. **项目提交与评估**:课程设计...

    sql模糊查询并按匹配度排序

    因为模糊查询通常不能利用索引,特别是在使用`LIKE '%关键词%'`这种模式时。为了解决这个问题,可以考虑使用全文索引或者对常用查询建立索引等方式来提高查询速度。 - 另外,对于非常大的数据集,可以考虑使用限制...

Global site tag (gtag.js) - Google Analytics