1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > MySQL索引系列--索引的优化--LIKE模糊查询

MySQL索引系列--索引的优化--LIKE模糊查询

时间:2019-11-10 20:24:53

相关推荐

MySQL索引系列--索引的优化--LIKE模糊查询

原文网址:MySQL索引系列--索引的优化--LIKE模糊查询_IT利刃出鞘的博客-CSDN博客

简介

本文介绍MySQL的LIKE模糊查询索引的优化。主要是索引失效的解决方案。

索引失效的解决方案

在MySQL中,模糊查询肯定要使用LIKE关键字,然后再加 %,是代表前模糊还是后模糊。数据量小的情况下,不容易看出查询的效率,但是数据量达到百万级,千万级甚至更高的时候,查询的效率就很容易显现出来了。

本处假设要查询的字段(where子句)都已经加了索引。

col_name like '%ABC'

本语句不走索引:

SELECT object_name from t1 WHERE object_name LIKE '%ABC';

解决方法:

CREATE INDEX idx_t1_objectname2 ON t1(reverse(object_name));SELECT object_name FROM t1 WHERE REVERSE(object_name)LIKE REVERSE('%ABC');

看执行计划:(改写后SQL走了索引。)

col_name like '%ABC%'

有三种情况:

ABC在字符串中位置不固定,可以通过改写SQL进行优化ABC始终从字符串开始的某个固定位置出现,可以创建函数索引进行优化ABC始终从字符串结尾的某个固定位置出现,可以创建函数组合索引进行优化

情况1

情况2

先创建substr函数索引,再使用like ‘ABC%’。

假如ABC从字符串第五位出现:

CREATE INDEX idx_substr_t1_objname ON t1 (SUBSTR(object_name,5,30));SELECT object_id,object_type,object_name FROM t1WHERE SUBSTR(object_name,5,30) LIKE 'TAB%';

情况3:

查询%xx的记录

SELECT COUNT(c.c_ply_no) AS COUNTFROM Policy_Data_All c, Item_Data_All iWHERE c.c_ply_no = i.c_ply_noAND i.C_LCN_NO LIKE '%245'

在执行的时候,执行计划显示,消耗值,io值,cpu值均非常大,原因是like后面前模糊查询导致索引失效,进行全表扫描。

解决方法:这种只有前模糊的sql可以改造如下写法

SELECT COUNT(c.c_ply_no) AS COUNTFROM Policy_Data_All c, Item_Data_All iWHERE c.c_ply_no = i.c_ply_noAND REVERSE(i.C_LCN_NO) LIKE REVERSE('%245')

优化原理

用索引全扫描取代表的全扫描。因为索引全扫描的代价是全表扫描的1/N (即索引块数与数据块数的比例),表越大,优化效果越明显。

改写后SQL的执行计划,根据索引再回表的代价要看符合条件的记录数多少:如果in子查询返回的记录数很少,那么优化的效果就相当于效率提高了N倍;如果in子查询返回的记录数较多,两种SQL的性能区别就不是很明显了。

其他网址

MySQL - 如何优化模糊查询(like 模糊查询)_数据库_Soinice的博客-CSDN博客

【转】【MySQL】Mysql模糊查询like提速优化 - 梦琪小生 - 博客园

SQL使用模糊查询like的优化 - 简书

索引与优化like查询

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。