加索引优化select EXPLAIN

文章讲述了在工作中遇到的一个搜索接口性能问题,接口需添加两个字段进行子表查询。原本的SQL查询已连接多个子表,执行时间约10秒。当增加一个子表后,查询时间超过1分钟。通过为新字段添加索引,查询时间恢复到10秒左右。文章讨论了SQL优化,包括对type字段的分析和索引的使用,以及如何处理分页查询时的性能问题。
摘要由CSDN通过智能技术生成

今天工作中遇到一个小问题,一个搜索接口,要加一个2个字段用于搜索

分析:这两个字段要在子表中去查询,查看原来mapper中的接口,已经连了N个子表,sql速度在10秒左右。

加上了新的子表,然后去试了一下 sql 一分钟以上没停。

解决:

因为在这个sql里也有分页,还是必须得连表

在子表的外键加上了索引,

恢复到了10秒左右

过程:

EXPLAIN SELECT …

type字段:

疑惑:

不是说 一般不让连那么多表吗?为啥公司连了这么多表?

思考:有没有其他解决方法,不连表怎么解决 根据新加条件的分页?

复习:

格式:

image-20230516213710673

explain

image-20230516213616110

image-20230516215200131

type字段: 上图,越前面越好

  • system:该表只有一行(相当于系统表),system是const类型的特例
  • const:主键或者唯一索引
  • eq_ref:当使用了索引的全部组成部分,并且索引是PRIMARY KEY或UNIQUE NOT NULL 才会使用该类型,性能仅次于system及const。
  • ref: 非唯一性索引或者当满足索引的最左前缀规则
  • range:范围扫描,表示检索了指定范围的行,主要用于有限制的索引扫描。比较常见的范围扫描是带有BETWEEN子句或WHERE子句里有>、>=、<、<=、IS NULL、<=>、BETWEEN、LIKE、IN()等操作符。
  • index: 遍历了整个索引树
  • ALL:全表扫描,性能最差。

Extra字段:

  • Using filesort:在使用order by关键字的时候,如果待排序的内容不能由所使用的索引直接完成排序的话,那么mysql有可能就要进行文件排序。filesort是通过相应的排序算法,将取得的数据在内存中进行排序。就是只用索引不够排序。
  • Using index:表示直接访问索引就足够获取到所需要的数据,不需要通过索引回表;
  • Using where:表示优化器需要通过索引回表查询数据
  • Using index condition: 会先条件过滤索引,过滤完索引后找到所有符合索引条件的数据行,随后用 WHERE 子句中的其他条件去过滤这些数据行;
  • Using temporary:表示由于排序没有走索引、使用union、子查询连接查询、使用某些视图等原因。因此创建了一个内部临时表。可能内存上的临时表或者是硬盘上的临时表。

主要关注:

image-20230516215329410

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值