解决mysql模糊查询索引失效问题的几种方法


Posted in MySQL onJune 18, 2021

我们在使用like %通配符时常常会引起索引失效的问题。
这里,我们讨论一下like使用%的几种情况:

下列例子用到的索引(VC_STUDENT_NAME)

一、like ‘xx%'

EXPLAIN select * from t_student where VC_STUDENT_NAME like ‘王%'

解决mysql模糊查询索引失效问题的几种方法

我们发现使用%不放在开头的时候,索引是有效的

二、like ‘%xx'

EXPLAIN select * from t_student where VC_STUDENT_NAME like ‘%王'

解决mysql模糊查询索引失效问题的几种方法

我们发现%放在开头时,索引便失效了。

上述两个例子说明,在使用通配符时,%放在开头会引起索引失效。
但在现实问题里,往往需要把%放在开头作模糊匹配。这是我们可以通过覆盖索引的方式即索引覆盖查询,来解决索引失效的问题。

EXPLAIN select * from t_student where VC_STUDENT_NAME like ‘%王'

解决mysql模糊查询索引失效问题的几种方法

把查询列换成索引与之相应的列,索引失效问题得以解决。

补充:

1.索引不存储null值

更准确的说,单列索引不存储null值,复合索引不存储全为null的值。索引不能存储Null,所以对这列采用is null条件时,因为索引上根本

没Null值,不能利用到索引,只能全表扫描。

为什么索引列不能存Null值?

将索引列值进行建树,其中必然涉及到诸多的比较操作。Null值的特殊性就在于参与的运算大多取值为null。

这样的话,null值实际上是不能参与进建索引的过程。也就是说,null值不会像其他取值一样出现在索引树的叶子节点上。

2.不适合键值较少的列(重复数据较多的列)

假如索引列TYPE有5个键值,如果有1万条数据,那么 WHERE TYPE = 1将访问表中的2000个数据块。

再加上访问索引块,一共要访问大于200个的数据块。

如果全表扫描,假设10条数据一个数据块,那么只需访问1000个数据块,既然全表扫描访问的数据块

少一些,肯定就不会利用索引了。

3.前导模糊查询不能利用索引(like '%XX'或者like '%XX%')

假如有这样一列code的值为'AAA','AAB','BAA','BAB' ,如果where code like '%AB'条件,由于前面是

模糊的,所以不能利用索引的顺序,必须一个个去找,看是否满足条件。这样会导致全索引扫描或者全表扫

描。如果是这样的条件where code like 'A % ',就可以查找CODE中A开头的CODE的位置,当碰到B开头的

数据时,就可以停止查找了,因为后面的数据一定不满足要求。这样就可以利用索引了。

4.索引失效的几种情况

1.如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因)

要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引

2.对于多列索引,不是使用的第一部分,则不会使用索引

3.like查询以%开头

4.如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引

5.如果mysql估计使用全表扫描要比使用索引快,则不使用索引

5.MySQL主要提供2种方式的索引:B-Tree索引,Hash索引

B树索引具有范围查找和前缀查找的能力,对于有N节点的B树,检索一条记录的复杂度为O(LogN)。相当于二分查找。

哈希索引只能做等于查找,但是无论多大的Hash表,查找复杂度都是O(1)。

显然,如果值的差异性大,并且以等值查找(=、 <、>、in)为主,Hash索引是更高效的选择,它有O(1)的查找复杂度。

如果值的差异性相对较差,并且以范围查找为主,B树是更好的选择,它支持范围查找。

到此这篇关于解决mysql模糊查询索引失效问题的几种方法 的文章就介绍到这了,更多相关mysql模糊查询索引失效内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
虚拟机linux端mysql数据库无法远程访问的解决办法
May 26 MySQL
浅谈MySQL之浅入深出页原理
Jun 23 MySQL
mysql left join快速转inner join的过程
Jun 30 MySQL
mysql 直接拷贝data 目录下文件还原数据的实现
Jul 25 MySQL
MySQL修炼之联结与集合浅析
Oct 05 MySQL
MySQL数据库超时设置配置的方法实例
Oct 15 MySQL
MySQL数据库索引的最左匹配原则
Nov 20 MySQL
分享mysql的current_timestamp小坑及解决
Nov 27 MySQL
JMeter对MySQL数据库进行压力测试的实现步骤
Jan 22 MySQL
一文弄懂MySQL索引创建原则
Feb 28 MySQL
Arthas排查Kubernetes中应用频繁挂掉重启异常
Feb 28 MySQL
mysqldump进行数据备份详解
Jul 15 MySQL
MySQL 亿级数据导入导出及迁移笔记
如何使用分区处理MySQL的亿级数据优化
Jun 18 #MySQL
详解MySQL中的pid与socket
Jun 15 #MySQL
MySQL 如何设计统计数据表
Jun 15 #MySQL
浅谈MySQL 亿级数据分页的优化
解析MySQL binlog
详细谈谈MYSQL中的COLLATE是什么
Jun 11 #MySQL
You might like
造就帕卡马拉的帕卡斯是怎么被发现的
2021/03/03 咖啡文化
PHP几个数学计算的内部函数学习整理
2011/08/06 PHP
Mysql的Root密码忘记,查看或修改的解决方法(图文介绍)
2013/06/14 PHP
ECshop 迁移到 PHP7版本时遇到的兼容性问题
2016/02/15 PHP
在修改准备发的批量美化select+可修改select时,在非IE下发现了几个问题
2007/01/09 Javascript
解读JavaScript中 For, While与递归的用法
2013/05/07 Javascript
js实现类似新浪微博首页内容渐显效果的方法
2015/04/10 Javascript
JavaScript返回上一页的三种方法及区别介绍
2015/07/04 Javascript
AngularJS基础 ng-class-odd 指令示例
2016/08/01 Javascript
JavaScript正则替换HTML标签功能示例
2017/03/02 Javascript
AngularJS基于http请求实现下载php生成的excel文件功能示例
2018/01/23 Javascript
ES6基础之默认参数值
2019/02/21 Javascript
javascript中undefined的本质解析
2019/07/31 Javascript
小程序如何支持使用 async/await详解
2019/09/12 Javascript
JS面向对象编程基础篇(二) 封装操作实例详解
2020/03/03 Javascript
vue使用better-scroll实现滑动以及左右联动
2020/06/30 Javascript
[26:21]浴火之凤-TI4世界冠军Newbee战队纪录片
2014/08/07 DOTA
Python实现列表删除重复元素的三种常用方法分析
2017/11/24 Python
Python使用re模块正则提取字符串中括号内的内容示例
2018/06/01 Python
Python设置在shell脚本中自动补全功能的方法
2018/06/25 Python
pandas 缺失值与空值处理的实现方法
2019/10/12 Python
PYTHON实现SIGN签名的过程解析
2019/10/28 Python
详解python破解zip文件密码的方法
2020/01/13 Python
pycharm 2020.2.4 pip install Flask 报错 Error:Non-zero exit code的问题
2020/12/04 Python
魔幻般冒泡背景的CSS3按钮动画
2016/02/27 HTML / CSS
Electric官网:美国高级眼镜和配件品牌
2020/06/04 全球购物
技术总监的工作职责
2013/11/13 职场文书
仓库管理专业个人的自我评价
2013/12/30 职场文书
上级检查欢迎词
2014/01/18 职场文书
国际经济与贸易专业大学生职业规划书
2014/03/01 职场文书
幼儿教师2014年度工作总结
2014/12/16 职场文书
施工员岗位职责
2015/02/10 职场文书
2015毕业设计工作总结
2015/07/24 职场文书
《静夜思》教学反思
2016/02/17 职场文书
担保书怎么写 ?
2019/04/22 职场文书
《勇者辞职不干了》ED主题曲无字幕动画MV公开
2022/04/13 日漫