mysql优化之like和=性能详析

 更新时间:2020年08月31日 08:56:39   作者:张子江  
这篇文章主要给大家介绍了关于mysql优化之like和=性能的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

引言

那使用过数据库的人大部分都知道,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还是'='时的执行过程也都是一样的么?

没错,事情不能只看表面,如果你细心研究,就会发现其实like和等于号'='并不是那么简单,下面我们将详细的分析他们两者的真正区别~~~

正文

首先,我们来介绍一下mysql中的explain关键字;explain是执行计划的意思,即通过该命令查看这条sql是如何执行的。
使用方法也很简单,即explain + sql语句,例如:

explain select * from info where id like '12345';

那我们来使用explain测试一下like和=下的查询情况,首先我们来测试一下为索引的字段:

EXPLAIN SELECT
 * 
FROM
 crms_customer 
WHERE
 id = '7cf79d7c8a3a4f94b5373b3ec392e32d';

而现在我们把"="换成like试一下:

EXPLAIN SELECT
 * 
FROM
 crms_customer 
WHERE
 id LIKE '7cf79d7c8a3a4f94b5373b3ec392e32d';

小伙伴通过对比可以看到两条返回结果的type字段和Extra字段中的数据有所不同,那为什么不同,他们所代表的含义是什么呢?

type字段

type字段是一个可选值,这些值的性能从低到高的排序如下:

type 说明
SYSTEM 系统,表仅有一行(=系统表)。这是const联接类型的一个特例
CONST 常量,表最多有一个匹配行,因为仅有一行,在这行的列值可被优化器剩余部分认为是常数,const表很快,因为它们只读取一次
EQ_REF 搜索时使用primary key 或 unique类型
REF 根据索引查找一个或多个值
INDEX_MERGE 合并索引,使用多个单列索引搜索
RANGE 对索引列进行范围查找
index 全索引表扫描
ALL 全数据表扫描

根据表格可以明显看出,其中const是常量查找,而RANGE是对索引列进行范围查找,所以性能也就很明显的体现了出来。

那使用like查询时,Extra字段代表什么呢?Extra字段中的Using where,又代表什么?

Extra字段

1,Extra字段是Explain输出中也很重要的列,所代表着MySQL查询优化器执行查询的过程中对查询计划的重要补充信息。

2,Extra字段中的Using where意味着mysql服务器将在存储引擎检索行后再进行过滤。所以比起使用使用'='又多了一步查找过程。

显然通过以上的总结我们可以得出结论:当我们使用索引字段进行条件查询时,'='的性能要比like快。

是不是以为到这里就结束了呢?

然而并没有

有的小伙伴该问了那非索引字段呢?

对的,我们下面继续测试非索引字段

EXPLAIN SELECT
 * 
FROM
 crms_customer 
WHERE
 customer_name = '张飞';
-----------------------------------
 
EXPLAIN SELECT
 * 
FROM
 crms_customer 
WHERE
 customer_name LIKE '张飞';

除了"="和like同样的两条语句,让我们运行一下:
"=":

like:

可以看出当非索引字段时like和"="是一样的,性能上也没有差别。

(当然,explain中还有很多其他字段,后续我会一一给小伙伴们讲解的。)

结论

经过我们的不懈努力,可以得到结论:当like和"="在使用非索引字段查询时,他们的性能是一样的;而在使用索引字段时,由于"="是直接命中索引的,只读取一次,而like需要进行范围查询,所以"="要比like性能好一些。~~~~

到此这篇关于mysql优化之like和=性能的文章就介绍到这了,更多相关mysql like和=性能内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL最大连接数限制的修改步骤

    MySQL最大连接数限制的修改步骤

    针对一些访问量比较大的网站,Mysql默认的最大连接数可能不够用,需要进行相应的修改,下面这篇文章主要给大家介绍了关于MySQL最大连接数限制的修改步骤,需要的朋友可以参考下
    2022-07-07
  • 开启bin-log日志mysql报错的解决方法

    开启bin-log日志mysql报错的解决方法

    开启bin-log日志mysql报错:This function has none of DETERMINISTIC, NO SQL解决办法,大家参考使用吧
    2013-12-12
  • mysql中like % %模糊查询的实现

    mysql中like % %模糊查询的实现

    这篇文章主要介绍了mysql中like % %模糊查询的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • phpstudy安装后mysql无法启动的解决

    phpstudy安装后mysql无法启动的解决

    本文主要介绍了phpstudy安装后mysql无法启动的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • MySQL数据库之字符集 character

    MySQL数据库之字符集 character

    这篇文章主要介绍了MySQL数据库之字符集 character,文章基于MySQL的的相关资料展开详细介绍,具有一定的参考价值需要的小伙伴可以参考一下
    2022-05-05
  • MySQL之终端Terminal(dos界面)管理数据库、数据表、数据的基本操作

    MySQL之终端Terminal(dos界面)管理数据库、数据表、数据的基本操作

    这篇文章主要介绍了MySQL之终端(Terminal)管理数据库、数据表、数据的基本操作,需要的朋友可以参考下
    2015-03-03
  • mysql更新一个表里的字段等于另一个表某字段的值实例

    mysql更新一个表里的字段等于另一个表某字段的值实例

    下面小编就为大家带来一篇mysql更新一个表里的字段等于另一个表某字段的值实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • 关于MySQL中Update使用方法举例

    关于MySQL中Update使用方法举例

    这篇文章主要给大家介绍了关于MySQL中Update使用方法的相关资料,更新数据是使用数据库时最重要的任务之一,在本教程中您将学习如何使用MySQL UPDATE语句来更新表中的数据,需要的朋友可以参考下
    2023-11-11
  • SQL Group By分组后如何选取每组最新的一条数据

    SQL Group By分组后如何选取每组最新的一条数据

    经常在分组查询之后,需要的是分组的某行数据,例如更新时间最新的一条数据,下面这篇文章主要给大家介绍了关于SQL Group By分组后如何选取每组最新的一条数据的相关资料,需要的朋友可以参考下
    2022-10-10
  • Mysql  DATEDIFF函数用法总结示例详解

    Mysql  DATEDIFF函数用法总结示例详解

    MySQL DATEDIFF()函数是MySQL中常见的日期函数之一,它主要用于计算两个日期之间的差值,单位可以是天、周、月、季度和年,DATEDIFF函数用于返回两个日期的天数,这篇文章主要介绍了Mysql  DATEDIFF函数,包括语法格式和示例代码讲解,需要的朋友可以参考下
    2023-03-03

最新评论