SQL优化

1、工具

在理解了MySQL中的索引类型及了解了索引的原理之后,我们就要知道索引是为了提高检索性能。

那么如何更好的合理使用索引,并且对一些执行较慢的sql进行优化也是我们必须掌握的一种技。

1.1 慢查询

MySQL的慢查询,全名是慢查询日志,是MySQL提供的一种日志记录,用来记录在MySQL中响应时间超过阀值得语句。

默认情况下,MySQL数据库并不开启动慢查询日志,需要手动来设置这个参数。

如果不是调优需要的话,一般不建议启动该参数,开启慢查询会或多或少带来一定得性能影响。

在这里插入图片描述
在这里插入图片描述
通过上图可以看出如果不使用索引拿name直接遍历查询花费的时间成本还是比较大的。

在这里插入图片描述
慢查询日志记录下的 ‘问题’ 语句。

1.2 EXPLAIN

一条查询语句在经过MySQL查询优化器的各种基于成本和规则的优化后会生成一个所谓的执行计划

这个执行计划展示了接下来具体的执行方式,比如多表连接的顺序是什么,对于每个表采用什么访问方法来具体执行查询等等。

MySQL为我们提供了EXPLAIN语句来帮助我们查看这个某个语句的具体执行计划。

在这里插入图片描述
EXPLAIN分析名词概念:
id 在一个大的查询语句中每个SELECT关键字都对应一个唯一的id
select_type SELECT关键字对应的那个查询的类型
table 表名
partitions 匹配的分区信息
type 针对单表的访问方法
possible_keys 可能用到的索引
key 实际上使用的索引
key_len 实际使用到的索引长度
ref 当使用索引列等值查询时,与索引列进行等值匹配的对象信息
rows 预估的需要读取的记录条数
filtered 某个表经过搜索条件过滤后剩余记录条数的百分比
Extra 一些额外的信息

在这里插入图片描述
上图是使用主键索引的语句执行计划。

在这里插入图片描述
给name字段添加索引,再次查询后可以看出只用了0.0.1秒。
在这里插入图片描述
再使用EXPLAIN分析。

2、索引优化

2.1 适当建立索引

大家看到,索引能给数据检索提高的效率非常明显

那么是否意味着我们只要尽可能多的去建立索引就可以了呢?

不可以。因为每建立一个索引都会建立一个B+数,并且需要维护,这些都是很费性能和空间的。所以我们要做到合理的建立索引

  • 创建并使用自增数字来建立主键索引
  • 经常作为where条件的字段建立索引
  • 添加索引的字段尽可能的保持唯一性
  • 可考虑使用联合索引并进行索引覆盖

2.2 合理使用索引

MySQL索引通常是被用于提高where条件的数据行匹配时的搜索速度,在所有的使用过程中,存在一些使用细节和注意事项。

因为不合理的使用可能会导致建立了索引之后,不一定就使用上了索引。

2.2.1 不要再列上使用函数和进行运算

使用函数:
在这里插入图片描述
进行运算:
在这里插入图片描述
EXPLAIN分析:列上进行运算后无索引可用
在这里插入图片描述

2.2.2 隐式转换可能影响索引失效

在这里插入图片描述

2.2.3 like语句可能导致的索引失效

在这里插入图片描述
注意:通配符尽可能的不要放在前面!

2.2.4 多个单列索引并不是最佳选择,可使用复合索引

MySQL只能使用一个索引,如果时多个单列索引会从中选择一个限制最为严格的索引使用,因此多个创建单列索引,并不能提高MySQL的查询性能,同时创建多个索引还可能出现空间的浪费。

案例:
1.创建多个单列索引
在这里插入图片描述
2. 使用三个索引查询
在这里插入图片描述
3.空间的浪费
在这里插入图片描述
复合索引:
在这里插入图片描述
注意遵循复合索引的最左原则,否则复合索引不生效(name没使用,直接使用email)
在这里插入图片描述

2.2.5 尽可能的达成索引覆盖

索引覆盖 :如果索引包含所有满足查询需要的数据的索引成为覆盖索引(Covering Index),也就是平时所说的不需要回表操作。

即是索引字段就是需要查询的字段,这样索引即是数据不需要再次会表。也可以尽可能的把查询字段定义为索引即使不用

3、SQL语句优化

  • 避免嵌套语句(子查询)
  • 避免多表查询(复杂查询简单化)
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页