首页 > 数据库 >mysql、oracle like查询不走索引的解决方案

mysql、oracle like查询不走索引的解决方案

时间:2023-02-14 10:03:23浏览次数:48  
标签:like ORGNAME 查询 索引 字符串 mysql oracle 失效

1.情景展示

我们知道:无论是mysql还是oracle,只要使用like查询,就可能会面临索引失效(不走索引)的问题;

下面,我们将一起来看看什么情况下,索引会失效,以及如何解决不走索引的问题。

已知,base_org_info表有两个索引

mysql、oracle like查询不走索引的解决方案_ORACLE

我们需要使用ORGNAME进行模糊查询,据此进行案例展示。

2.具体分析

要想解决走不走索引的问题,首先,我们需要确定的是:索引在哪的问题?

通常情况下,我们为了提高查询效率,往往会建一些索引;

我们要使用索引,需要满足两个条件:

第一,创建索引;

第二,将要查询条件(where)包含索引列。

举个例子:

如果没有where限制条件,查询的将是所有数据,这一点大家都知道。

mysql、oracle like查询不走索引的解决方案_主键_02

只要查询条件包含索引列,就会走索引;

mysql、oracle like查询不走索引的解决方案_字段_03

即使,存在其他限制条件,也会走索引;

mysql、oracle like查询不走索引的解决方案_ORACLE_04

但是,like查询可能会让索引失效,具体见下文。

另外的话,主键字段本身索引,而且是唯一索引。

mysql、oracle like查询不走索引的解决方案_主键_05

情形一:like '字符串%'和like '字符串_';

mysql、oracle like查询不走索引的解决方案_ORACLE_06

这种情况和'='一样,都会走索引。

情形二:like '%字符串'和like '_字符串';

mysql、oracle like查询不走索引的解决方案_mysql_07

不走索引,索引IDX_BASE_ORG_INFO_ORGNAME失效;

情形三:like '%字符串%'和like '_字符串_';

mysql、oracle like查询不走索引的解决方案_字符串_08

不走索引,索引IDX_BASE_ORG_INFO_ORGNAME失效;

说明:_和%的索引失效情况,一模一样,不再截图展示。

3.解决方案

先来说说这种情况:

mysql、oracle like查询不走索引的解决方案_ORACLE_09

虽然,限制条件orgseq是索引列,但是,这个索引不起作用,因为like查询走的是全表扫描!!! 

解决方案一:创建复合索引;

为where后面的所有限制条件,联合创建一个索引。

mysql、oracle like查询不走索引的解决方案_字符串_10

一起来看下效果:

mysql、oracle like查询不走索引的解决方案_主键_11

此时,咱们新建的联合索引生效了,是不是到此为止了?

别急,一个神奇的事情将会发生:

mysql、oracle like查询不走索引的解决方案_mysql_12

我们可以看到:索引,又失效了!

所以说,这种方式仅限于查询对应的索引列,一旦查询的字段不是组合索引当中的索引列的话,索引将会失效;

另外,这种方式也仅限于:少量的查询限制条件,如果字段太多就失去了使用索引的意义。

解决方案二:使用内连接。(推荐使用)

SELECT
t.ORGSEQ,
t2.ORGNAME
FROM
base_org_info_copy1 t,
( SELECT t.ORGID, t.ORGNAME FROM base_org_info_copy1 t WHERE t.ORGNAME LIKE '%阳_' ) t2
WHERE
t2.ORGID = t.ORGID

第一步:为要使用like '%字符串%'或者'%字符串'的列创建单独索引;

第二步:查询该字段与主键列,并将查询结果作为一张表;

第三步:与原来的表,使用主键列建立内连接;

第四步:其它查询限制条件使用原来的表进行限制。

mysql、oracle like查询不走索引的解决方案_字符串_13

我们可以从上图当中看到,走了索引列:IDX_BASE_ORG_INFO_ORGNAME;

用了唯一索引:主键列ORGID,因为两表关联用的它。

4.扩展

Mysql innodb引擎默认的索引数据结构是​​b+​​树,组合索引会形成多字段顺序排序,比如下图,会先按照姓名进行排序,姓名相等就再按照年龄排序,所以会有组合索引的最左前缀原理(这就是使用组合索引,并且只查询索引列的时候,like'%字符串'可以走组合索引的原因);

而假如只​​like​​​查询姓名,例如​​like "张%"​​​,则也可以使用最左前缀原理,先索引到​​张六​​​,然后遍历查询,直到姓名不以​​张​​开头。

mysql、oracle like查询不走索引的解决方案_mysql_14

写在最后

  哪位大佬如若发现文章存在纰漏之处或需要补充更多内容,欢迎留言!!!



作者:Marydon

标签:like,ORGNAME,查询,索引,字符串,mysql,oracle,失效
From: https://blog.51cto.com/u_15964717/6055561

相关文章

  • mysql 非空判断(判断字段值是否为空)
    1.情景展示mysql如何判断表字段值是否为空?2.非空判断方式一:表字段+isnotnull方式二:notisnull(表字段)方式三:!isnull(表字段)3.为空判断方式一:表字段+isnull方式二:is......
  • mysql 循环批量建表(表结构相同,表名可以自定义)
    1.情景展示现在有这样一种需求:我需要建两百多张表,这些表的表结构相同,表的名称也是提前拟定好的,必须使用指定的表名;如果使用一个个写SQL语句,那不还得累死,所以,我想到了可不可......
  • mysql limit分页用法讲解
    1.情景展示在Oracle当中,使用rownum来进行分页;而在mysql中,是没有rownum的,需要通过limit来实现。2.用法介绍limit[offset,]rowslimit后面可以跟一个参数,也可以跟两个参数;格式......
  • mysql、oracle 分组查询,每组取一条数据
    1.情景展示有这样一种需求:将数据按照机构进行分组,然后取每个机构下只取一条记录,如何实现?2.mysql分组查询出来某字段,然后和原来的表进行关联查询。方式一:通过内连接来实现查......
  • MySQL 8.0 修改root远程登录【ERROR 1410 (42000): You are not allowed to create a
    MySQL8.0的数据库root用户默认无法远程登录,需要修改root的远程授权,如下:mysql>grantallprivilegeson*.*to'root'@'%';ERROR1410(42000):Youarenotallowed......
  • (数据库系统概论|王珊)第三章关系数据库标准语言SQL-第零节:MYSQL环境安装和表的建立以及
    pdf下载:密码7281专栏目录首页:【专栏必读】(考研复试)数据库系统概论第五版(王珊)专栏学习笔记目录导航及课后习题答案详解目录一:注意事项二:MYSQL环境(1)下载(2)安装(3)MYSQL可视......
  • 12. Oracle的初始化参数和性能视图
    一.性能参数1.CPUparametercpu_count:显示的是逻辑cpu数量(thread),主要是对并行度有影响2.Memoryparameterpga_aggregate_target:可以自动对pga进行调......
  • [Oracle19C ASM管理] ASM的网络服务
    启用了ASM集群以后,网络管理放给了grid用户。grid用户的$ORACLE_HOME/network/admin有网络配置文件,而oracle用户下的网络配置文件则不存在了。[[email protected]......
  • mysql 创建库和表
    数据库创建数据库查看数据库删除数据库数据表创建表查看表删除表清除表数据数据库创建数据库语法CREATEDATABASE[IFNOTEXISTS]<数据库名>[[DEFA......
  • MySQL基础
    基础篇通用语法及分类DDL:数据定义语言,用来定义数据库对象(数据库、表、字段)DML:数据操作语言,用来对数据库表中的数据进行增删改DQL:数据查询语言,用来查询数据库中......