关于mysql:mysql优化篇like和的性能分析

12次阅读

共计 1782 个字符,预计需要花费 5 分钟才能阅读完成。

引言

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

正文完
 0