今天工作中遇到一个小问题,一个搜索接口,要加一个2个字段用于搜索
分析:这两个字段要在子表中去查询,查看原来mapper中的接口,已经连了N个子表,sql速度在10秒左右。
加上了新的子表,然后去试了一下 sql 一分钟以上没停。
解决:
因为在这个sql里也有分页,还是必须得连表
在子表的外键加上了索引,
恢复到了10秒左右
过程:
EXPLAIN SELECT …
type字段:
疑惑:
不是说 一般不让连那么多表吗?为啥公司连了这么多表?
思考:有没有其他解决方法,不连表怎么解决 根据新加条件的分页?
复习:
格式:
explain
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、子查询连接查询、使用某些视图等原因。因此创建了一个内部临时表。可能内存上的临时表或者是硬盘上的临时表。
主要关注: