首页 > 数据库 >对比Oracle和MySQL索引对于like的支持,MySQL一言难尽啊...

对比Oracle和MySQL索引对于like的支持,MySQL一言难尽啊...

时间:2024-06-21 16:45:44浏览次数:27  
标签:... 00 like MySQL test select name

 

对比Oracle和MySQL索引对于like的支持,MySQL一言难尽啊...

 

MySQL:                                                                           |  Oracle:
(root@localhost 09:44:08) [zkm](673009)> select * from test;                     |  09:52:11 ZKM@test(1076)> select * from test;
+------+-----------+                                                             |  
| id   | name      |                                                             |          ID NAME
+------+-----------+                                                             |  ---------- -------------------------
|    1 | aaabbbccc |                                                             |           1 aaabbbccc
|    2 | dddeeefff |                                                             |           2 dddeeefff
|    3 | a  b   c  |                                                             |           3 a  b   c
+------+-----------+                                                             |  
3 rows in set (0.01 sec)                                                         |  Elapsed: 00:00:00.00
                                                                                 |  09:52:38 ZKM@test(1076)> create index idx_t_name on test(name);
(root@localhost 09:44:11) [zkm](673009)> create index idx_t_name on test(name);  |  
Query OK, 0 rows affected (0.26 sec)                                             |  Index created.
Records: 0  Duplicates: 0  Warnings: 0                                           |  
                                                                                 |  Elapsed: 00:00:00.02

 

 

现有SQL语句如下:

再Oracle和MySQL中正常无法自动走索引。

select * from test where name like '%ccc';

 

现在如果使用hint进行强制走索引操作,Oracle是支持的,但是MySQL就无法实现。。防。

https://www.cnblogs.com/PiscesCanon/p/18260833

MySQL强制走索引:
(root@localhost 16:28:50) [zkm](721306)> explain select * from test force index(idx_t_name) where name like '%ccc';
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra       |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | test  | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    3 |    33.33 | Using where |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
1 row in set, 1 warning (0.12 sec)
PS:使用如下hint结果一样:



Oracle强制走索引:
10:00:52 ZKM@test(1076)> explain plan for select /*+ index(test(name)) */ * from test where name like '%ccc';

Explained.

Elapsed: 00:00:00.00
10:01:06 ZKM@test(1076)> select * from table(dbms_xplan.display());

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------
Plan hash value: 3081316380

------------------------------------------------------------------------------------------
| Id  | Operation                   | Name       | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |            |     1 |    25 |     2   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| TEST       |     1 |    25 |     2   (0)| 00:00:01 |
|*  2 |   INDEX FULL SCAN           | IDX_T_NAME |     1 |       |     1   (0)| 00:00:01 |
------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - filter("NAME" IS NOT NULL AND "NAME" LIKE '%ccc')

 

 

对于where谓词条件中,reserve(name) like reserve('%ccc')的情况一样:

MySQL和Oracle都删除索引,并重新创建函数索引如下:

create index idx_t_name on test((reverse(name)));

 

 

MySQL依然无法使用索引,Oracle可以:

MySQL:
(root@localhost 16:34:17) [zkm](721306)> explain select * from test force index(idx_t_name) where reverse(name) like reverse('%ccc');
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra       |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | test  | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    3 |   100.00 | Using where |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
1 row in set, 1 warning (0.00 sec)
PS:以下两种方式均不行
explain select * from test use index(idx_t_name) where reverse(name) like reverse('%ccc');
explain select /*+ index(test idx_t_name) */ * from test where reverse(name) like reverse('%ccc');

Oracle:
10:52:46 ZKM@test(1076)> explain plan for select * from test where reverse(name) like reverse('%ccc');

Explained.

Elapsed: 00:00:00.01
10:55:06 ZKM@test(1076)> select * from table(dbms_xplan.display());

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------
Plan hash value: 2114388309

------------------------------------------------------------------------------------------
| Id  | Operation                   | Name       | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |            |     1 |    37 |     2   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| TEST       |     1 |    37 |     2   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN          | IDX_T_NAME |     1 |       |     1   (0)| 00:00:01 |
------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access(REVERSE("NAME") LIKE 'ccc%')
       filter(REVERSE("NAME") LIKE 'ccc%')

 

 

哎,优化时候遇到的问题。

只能跟业务讨论然后改SQL了。

 

标签:...,00,like,MySQL,test,select,name
From: https://www.cnblogs.com/PiscesCanon/p/18260833

相关文章

  • PostgreSQL中 FETCH FIRST ... WITH TIES 是查询结果中限制返回的行数
    在PostgreSQL中,FETCHFIRST…WITHTIES是一个在查询结果中限制返回的行数,但同时确保与最后一行具有相同排序值的所有行都被包括进来的子句。这通常与ORDERBY子句一起使用。当您使用FETCHFIRSTnROWSONLY时,您只会得到前n个排序后的行。但是,如果您希望包括与......
  • MySQL索引、事务与存储引擎
    目录1.索引介绍(1)工作方式(2)创建索引的依据2.索引类型(1)普通索引(2)唯一索引(3)主键索引(4)多列组合索引(单列索引与多列索引)(5)全文索引(FULLTEXT)(6)删除和查看索引以及各字段的含义(1)删除索引(2)查看索引(3)各字段的含义3.遇到select查询语句执行速度慢该怎么办?4.事务介绍(1)事务的ACID特性(2)隔离......
  • MySQL数据库管理
    目录1.SQL语句(1)DDL:用于管理数据库对象(库、表、索引等)(2)DML:用于管理表数据(3)DQL:用于查询表数据(4)DCL:用于管理用户和权限2.创建及删除数据库和表3.修改表名和表结构4.数据表高级操作5.如何找回root密码?6.MySQL的六大约束属性7.权限管理1.SQL语句关系型数据库专用的操作管理语句,包......
  • MYSQL基础_18_MySQL8其它新特性
    第18章_MySQL8其它新特性1.MySQL8新特性概述MySQL从5.7版本直接跳跃发布了8.0版本,可见这是一个令人兴奋的里程碑版本。MySQL8版本在功能上做了显著的改进与增强,开发者对MySQL的源代码进行了重构,最突出的一点是多MySQLOptimizer优化器进行了改进。不仅在速度上得到了改......
  • MYSQL基础_17_触发器
    第17章_触发器在实际开发中,我们经常会遇到这样的情况:有2个或者多个相互关联的表,如商品信息和库存信息分别存放在2个不同的数据表中,我们在添加一条新商品记录的时候,为了保证数据的完整性,必须同时在库存表中添加一条库存记录。这样一来,我们就必须把这两个关联的操作步......
  • 结合zabbix监控mysql,让mysql性能飙升
      前段时间客户的系统突然出现mysql只读集群cpu飙升的情况,飙升到最高点的时候,甚至导致应用服务器GC,幸好应用有备份服务器,流量直接切过去,客户也无感知。但是这个只是临时的解决办法,总归要找到具体的原因,和开发同事查了两天的应用日志和mysql的慢日志,始终无法定位到具体的问题。......
  • 【Mysql】MySQL存储引擎的介绍
    文章目录前言一、存储引擎简介二、使用场景三、总结前言在处理大量数据的系统中,如何快速准确的获取所需的信息是一个重要的问题。这就像在一个巨大的图书馆中寻找一本书,如果没有目录或指南,这将是一项艰巨的任务。在数据库中,我们使用索引来解决这个问题。本文将介绍M......
  • 五天搞定Mysql基础知识-Day05
    学习目标:        1、MySQL常用内置函数        2、了解存储过程        3、了解视图        4、了解事务        5、了解索引        6、掌握基于命令行的SQL使用第一章MySQL内置函数一、字符串函数1、拼接字符串......
  • MySQL触发器基本结构
    1修改分隔符符号delimiter$$可以修改成$$//都行2创建触发器函数名称createtrigger函数名3什么样的操作触发,操作那个表after:....之后触发before:....之前触发inser:插入被触发uodate:修改被触发delete:删除被触发on表名实例:在users表被添加信息后触发af......
  • JavaWeb——Mysql的启动/登录/卸载
    目录1.Mysql服务器2.Mysql的简单使用2.1启动Mysql:2.2登录Mysql2.3退出3.连接别人的数据库4.卸载mqsql1.Mysql服务器安装了Mysql的计算机都成为Mysql服务器 2.Mysql的简单使用2.1启动Mysql:第一种方法:搜索服务,找到Mysql80,右击打开;第二种方法:输入cmd,右击命......