引言
那应用过数据库的人大部分都晓得,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性能好一些。~~~~