mysql优化篇:where中的like和=的性能分析
写在前面:2020年面试必备的Java后端进阶面试题总结了一份复习指南在Github上,内容详细,图文并茂,有需要学习的朋友可以Star一下! GitHub地址:https://github.com/abel-max/Java-Study-Note/tree/master
一、引言
那使用过数据库的人大部分都知道,like和=号在功能上的相同点和不同点, 那我在这里简单的总结下: 1,不同点:like可以用作模糊查询,而'='不支 持此功能;如下面的例子,查询info表中字段id第一个字母为1的数据:
select * from info where id like '1%';
2,相同点:like和"="都可以进行精确查询,比如下面的例子,从结果上 看,都是查询info表中字段id等于'12345'的结果:
select * from info where id like '12345';
以上就是返回结果中,like和'='中的相同和不同点。那好奇的小伙伴可能就要问了,那执行过程呢?mysql不管是遇到like还是'='时的执行过程也都是一样的么?
mysql优化篇:where中的like和=的性能分析
没错,事情不能只看表面,如果你细心研究,就会发现其实like和等于号'='并不是那么简单,下面我们将详细的分析他们两者的真正区别~~~
二、正文
首先,我们来介绍一下mysql中的explain关键字;explain是执行计划的意思,即通过该命令查看这条sql是如何执行的。
使用方法也很简单,即 explain + sql语句 ,例如:
explain select * from info where id like '12345';
具体对于explain关键字的介绍我会将在以后的博客中总结,目前不懂得小伙伴可以自行百度。。。
mysql优化篇:where中的like和=的性能分析
那我们来使用explain测试一下like和=下的查询情况,首先我们来测试一下为索引的字段:
EXPLAIN SELECT
* FROM
crms_customer WHERE
id = '7cf79d7c8a3a4f94b5373b3ec392e32d';
mysql优化篇:where中的like和=的性能分析
而现在我们把"="换成like试一下:
EXPLAIN SELECT
* FROM
crms_customer WHERE
id LIKE '7cf79d7c8a3a4f94b5373b3ec392e32d';
mysql优化篇:where中的like和=的性能分析
小伙伴通过对比可以看到两条返回结果的type字段和Extra字段中的数据有所不同,那为什么不同,他们所代表的含义是什么呢?
type字段:
type字段是一个可选值,这些值的性能从低到高的排序如下:
mysql优化篇:where中的like和=的性能分析
根据表格可以明显看出,其中const是常量查找,而RANGE是对索引列进行范围查找,所以性能也就很明显的体现了出来。
那使用like查询时,Extra字段代表什么呢?Extra字段中的Using where,又代表什么?
Extra字段
1,Extra字段是Explain输出中也很重要的列,所代表着MySQL查询优化器执行查询的过程中对查询计划的重要补充信息。
2,Extra字段中的Using where意味着mysql服务器将在存储引擎检索行后再进行过滤。所以比起使用使用'='又多了一步查找过程。
显然通过以上的总结我们可以得出结论:当我们使用索引字段进行条件查询时,'='的性能要比like快。
是不是以为到这里就结束了呢?
然而并没有
mysql优化篇:where中的like和=的性能分析
有的小伙伴该问了那非索引字段呢?
对的,我们下面继续测试非索引字段
EXPLAIN SELECT
* FROM
crms_customer WHERE
customer_name = '张飞';
-----------------------------------
EXPLAIN SELECT
*
FROM
crms_customer
WHERE
customer_name LIKE '张飞';
除了"="和like同样的两条语句,让我们运行一下:
"=":
mysql优化篇:where中的like和=的性能分析
like:
mysql优化篇:where中的like和=的性能分析
可以看出当非索引字段时like和"="是一样的,性能上也没有差别。
结论
经过我们的不懈努力,可以得到结论:当like和"="在使用非索引字段查询时,他们的性能是一样的;而在使用索引字段时,由于"="是直接命中索引的,只读取一次,而like需要进行范围查询,所以"="要比like性能好一些。~~~~
- 仿今天头条加载环境文字闪动效果
- Myexclipse创建Junit测试
- 基于ASP.NET MVC(C#)和Quartz.Net组件实现的定时执行任务调度
- 第五章 正则表达式的拆分
- android 防止反编译的若干方法
- 支持Ajax跨域访问ASP.NET Web Api 2(Cors)的简单示例教程演示
- android 股票K线图
- github搭建个人网站
- Android:一个高效的UI才是一个拉风的UI
- 什么是ORM?为什么用ORM?浅析ORM的使用及利弊
- .NET[C#]中实现实体对象深拷贝(克隆/复制)的几种方法
- Android中图片大小和屏幕密度的关系讲解
- C# WINFORM通过委托和事件窗体间(跨窗体)传值(自定义事件参数)--实例详解
- Apache Spark 2.0预览:机器学习模型持久性
- MySQL 教程
- MySQL 安装
- MySQL 管理与配置
- MySQL PHP 语法
- MySQL 连接
- MySQL 创建数据库
- MySQL 删除数据库
- MySQL 选择数据库
- MySQL 数据类型
- MySQL 创建数据表
- MySQL 删除数据表
- MySQL 插入数据
- MySQL 查询数据
- MySQL where 子句
- MySQL UPDATE 查询
- MySQL DELETE 语句
- MySQL LIKE 子句
- mysql order by
- Mysql Join的使用
- MySQL NULL 值处理
- MySQL 正则表达式
- MySQL 事务
- MySQL ALTER命令
- MySQL 索引
- MySQL 临时表
- MySQL 复制表
- 查看MySQL 元数据
- MySQL 序列 AUTO_INCREMENT
- MySQL 处理重复数据
- MySQL 及 SQL 注入
- MySQL 导出数据
- MySQL 导入数据
- MYSQL 函数大全
- MySQL Group By 实例讲解
- MySQL Max()函数实例讲解
- mysql count函数实例
- MYSQL UNION和UNION ALL实例
- MySQL IN 用法
- MySQL between and 实例讲解
- 自定义配置类,读取Application.properties中的参数
- 将InputSteram转换成文件输出并下载至本地
- sql serve2008是否自带互斥锁
- Flutter基础widgets教程-CupertinoSwitch篇
- Flutter基础widgets教程-CupertinoTabScaffold篇
- C++11 move 语义
- 论函数的设计应如何才好,返回临时变量 | 返回引用 | 传递引用
- Flutter基础widgets教程-CupertinoTabView篇
- 关于time的使用
- class priority_queue<> 简单介绍
- C++ share_prt 简单设计和实现
- 使用函数对象与使用函数的比较
- C++ 函数指针的定义方法及使用
- C++ 线程池的简易实现
- Flutter基础widgets教程-DataTable篇