解决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 相关文章推荐
MySQL入门命令之函数-单行函数-流程控制函数
Apr 05 MySQL
MySQL创建索引需要了解的
Apr 08 MySQL
MySQL 存储过程的优缺点分析
May 20 MySQL
MySQL中IF()、IFNULL()、NULLIF()、ISNULL()函数的使用详解
Jun 26 MySQL
MySQL系列之十五 MySQL常用配置和性能压力测试
Jul 02 MySQL
MySQL深度分页(千万级数据量如何快速分页)
Jul 25 MySQL
一文搞清楚MySQL count(*)、count(1)、count(col)区别
Mar 03 MySQL
MySQL如何快速创建800w条测试数据表
Mar 17 MySQL
MySQL限制查询和数据排序介绍
Mar 25 MySQL
mysql字段为NULL索引是否会失效实例详解
May 30 MySQL
mysql数据库隔离级别详解
Jun 16 MySQL
Mysql如何查看是否使用到索引
Dec 24 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
星际争霸任务指南——神族
2020/03/04 星际争霸
php for 循环语句使用方法详细说明
2010/05/09 PHP
如何解决CI框架的Disallowed Key Characters错误提示
2013/07/05 PHP
PHP实现通过中文字符比率来判断垃圾评论的方法
2014/10/20 PHP
php连接oracle数据库的核心步骤
2016/05/26 PHP
PHP设置images目录不充许http访问的方法
2016/11/01 PHP
PHP 应用容器化以及部署方法
2018/02/12 PHP
$.get获取一个文件的内容示例代码
2013/09/11 Javascript
跟我学Node.js(四)---Node.js的模块载入方式与机制
2014/06/04 Javascript
jQuery中大家不太了解的几个方法
2015/03/04 Javascript
jQuery中的基本选择器用法学习教程
2016/04/14 Javascript
jQuery实现的鼠标经过时变宽的效果(附demo源码)
2016/04/28 Javascript
JS中正则表达式全局匹配模式 /g用法详解
2017/04/01 Javascript
JS设置手机验证码60s等待实现代码
2017/06/14 Javascript
gulp安装以及打包合并的方法教程
2017/11/19 Javascript
使用Bootstrap4 + Vue2实现分页查询的示例代码
2017/12/21 Javascript
vue 取出v-for循环中的index值实例
2019/11/09 Javascript
利用Python的Flask框架来构建一个简单的数字商品支付解决方案
2015/03/31 Python
详解Python的collections模块中的deque双端队列结构
2016/07/07 Python
对pandas中apply函数的用法详解
2018/04/10 Python
python正则表达式匹配IP代码实例
2019/12/28 Python
python 微信好友特征数据分析及可视化
2020/01/07 Python
Python flask框架如何显示图像到web页面
2020/06/03 Python
python中setuptools的作用是什么
2020/06/19 Python
浅谈keras中loss与val_loss的关系
2020/06/22 Python
如何解决pycharm调试报错的问题
2020/08/06 Python
Spy++的使用方法及下载教程
2021/01/29 Python
马来西亚在线时尚女装商店:KEI MAG
2017/09/28 全球购物
千禧酒店及度假村官方网站:Millennium Hotels and Resorts
2019/05/10 全球购物
Zalando Lounge瑞士:时尚与生活方式购物俱乐部
2020/03/12 全球购物
.TTL是什么?有什么用处,通常那些工具会用到它?(ping? traceroute? ifconfig? netstat?)
2016/05/09 面试题
员工安全承诺书
2014/05/22 职场文书
大学生应聘导游自荐信
2014/06/02 职场文书
医学生求职自荐书
2014/06/12 职场文书
医院见习报告范文
2014/11/03 职场文书
Python学习之包与模块详解
2022/03/19 Python