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和=性能内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • MySQL中create table as 与like的区别分析

    本文分析了MySQL中create table as 与like的区别.分享给大家供大家参考,具体如下: 对于mysql的复制相同表结构方法,有create table as 和create table like 两种,区别是什么呢? 复制代码 代码如下: create table t2 as select * from t1 where 1=2; 或者 复制代码 代码如下: limit 0; as创建出来的t2表(新表)缺少t1表(源表)的索引信息,只有表结构相同,没有索引. 复制代码 代码如

  • MySQL中LIKE子句相关使用的学习教程

    MySQL LIKE 语法 LIKE 运算符用于 WHERE 表达式中,以搜索匹配字段中的指定内容,语法如下: WHERE column LIKE pattern WHERE column NOT LIKE pattern 在 LIKE 前面加上 NOT 运算符时,表示与 LIKE 相反的意思,即选择 column 不包含 pattern 的数据记录. LIKE 通常与通配符 % 一起使用,% 表示通配 pattern 中未出现的内容.而不加通配符 % 的 LIKE 语法,表示精确匹配,其实际效

  • 老生常谈MYSQL模式匹配 REGEXP和like的用法

    like like要求整个数据都要匹配,而REGEXP只需要部分匹配即可.  也就是说,用Like,必须这个字段的所有内容满足条件,而REGEXP只需要有任何一个片段满足即可. MySQL提供标准的SQL模式匹配(like),以及一种基于象Unix实用程序如vi.grep和sed的扩展正则表达式模式匹配的格式(regexp). SQL的模式匹配允许你使用"_"匹配任何单个字符,而"%"匹配任意数目字符(包括零个字符).在 MySQL中,SQL的模式缺省是忽略大小写的

  • MySQL Like语句的使用方法

    REGEXP例1.查询字段中包含非英文的数据 复制代码 代码如下: SELECT *FROM `m_user`WHERE `emp_no`REGEXP '[^ -~]' =1 列2.这样能把所有不含英文的都搞出来 复制代码 代码如下: SELECT *FROM tableWHERE nameNOT REGEXP '[a-zA-Z0-9]+' 当然除了regexp之外还可以使用FIND_IN_SET,like来操作FIND_IN_SETmysql中如何使用FIND_IN_SET(),以及使用FIN

  • MySql like模糊查询通配符使用详细介绍

    一.SQL模式 SQL的模式匹配允许你使用"_"匹配任何单个字符,而"%"匹配任意数目字符(包括零个字符).在 MySQL中,SQL的模式缺省是忽略大小写的.下面显示一些例子.注意在你使用SQL模式时,你不能使用=或!=:而使用LIKE或NOT LIKE比较操作符. SELECT 字段 FROM 表 WHERE 某字段 Like 条件 其中关于条件,SQL提供了四种匹配模式: 1,%:表示任意个或多个字符.可匹配任意类型和长度的字符. 比如 SELECT * FRO

  • mysql like查询字符串示例语句

    MySQL提供标准的SQL模式匹配,以及一种基于象Unix实用程序如vi.grep和sed的扩展正则表达式模式匹配的格式 一.SQL模式 SQL的模式匹配允许你使用"_"匹配任何单个字符,而"%"匹配任意数目字符(包括零个字符).在 MySQL中,SQL的模式缺省是忽略大小写的.下面显示一些例子.注意在你使用SQL模式时,你不能使用=或!=:而使用LIKE或NOT LIKE比较操作符. SELECT 字段 FROM 表 WHERE 某字段 Like 条件 其中关于条

  • mysql模糊查询like和regexp小结

    在mysql中实现模糊查询的有like和regexp. ------------------------ like的用法许多人都是知道的,最为常用的情况就是select * from a where name like '%a%'; 其中'%'代表的是任意个字符,它的效果像是正则表达式里的'*',它有几种用法:'a%','%a%','%a',分别表示以什么开头,存在什么以及以什么结尾. 另外也可以使用'_'字符,这表示一个任意字符.效果类似正则表达式里面的'.'. like是对这个字段里面的所有

  • php mysql like 实现多关键词搜索的方法

    或者叫,分词检索数据库 $res = mysql_query("select * from peter where id like '%中草药%' and '%6%'"); //这样写是报错的: $res = mysql_query("select * from peter where id like '%中草药%' or '%6%'"); //而这样写是正确的:奇怪~ $res = mysql_query("select * from peter whe

  • mysql正则表达式 LIKE 通配符

    扩展正则表达式的一些字符是: "."匹配任何单个的字符. 一个字符类"[...]"匹配在方括号内的任何字符.例如,"[abc]"匹配"a"."b"或"c".为了命名字符的一个范围,使用一个"-"."[a-z]"匹配任何小写字母,而"[0-9]"匹配任何数字. " * "匹配零个或多个在它前面的东西.例如,&q

  • mysql 的 like 问题,超强毕杀记!!!

    方法一: 解决方法是对于包含中文的字段加上"binary"属性,使之作为二进制比较,例如将"name char(10)"改成"name char(10)binary".  方法二:  如果你使用源码编译MySQL,可以编译MySQL时使用--with--charset=gbk 参数,这样MySQL就会直接支持中文查找和排序了. 方法三:  可以使用 Mysql 的 locate 函数来判断.以上述问题为例,使用方法为: SELECT * FROM

随机推荐