MySQL优化之索引优化

以下是最近学习MySQL的一些笔记,推荐一起阅读:

MySQL逻辑架构介绍

MySQL性能分析

MySQL索引优化

MySQL查询截取分析

MySQL锁机制

MySQL主从赋值

索引优化

索引优化案例

单表案例

使用我自己爬取的car_db二手车数据作为一个简单的练习素材,其列分布如下:

+------------+--------------+------+-----+---------+-------+
| Field      | Type         | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+-------+
| time       | int(11)      | YES  |     | NULL    |       |
| title      | varchar(255) | YES  |     | NULL    |       |
| href       | varchar(255) | NO   | PRI |         |       |
| age        | int(11)      | YES  |     | NULL    |       |
| kms        | double       | YES  |     | NULL    |       |
| city       | varchar(32)  | YES  |     | NULL    |       |
| trade_date | datetime     | YES  |     | NULL    |       |
| price      | double       | YES  |     | NULL    |       |
+------------+--------------+------+-----+---------+-------+

现在的有一个要求是:获取城市为北京,成交价格>5W的车龄最小的成交信息标题和该成交车辆的公里数,SQL如下:

select title, kms 
from t_ttpai where city='北京' and price > 5 
order by age asc 
limit 1;

可以看到,可以获得最终结果:

MySQL优化之索引优化_第1张图片

使用EXPLAIN指令来查看MySQL对该select语句的解析情况:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-o6EWbSiI-1598535462132)(/Users/dzzhyk/Desktop/apeBook/src/image-20200810223029241.png)]

可以看到,虽然查询出了结果,但是type为ALL全表扫描,并且产生了文件内排序情况(Using filesort)

因此,我们进一步对这个表进行优化,添加索引:

由于我们查询使用到的字段为city,price,age这三个,所以先直接添加一个复合索引(city,price,age)

alter table t_ttpai add index index_cpa (city, price, age) using btree;

查看索引建立情况:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wNf0mIc7-1598535462134)(/Users/dzzhyk/Desktop/apeBook/src/image-20200810223653833.png)]

可以看到索引顺序为 city,price,age,第一个为主键索引

接下来再次使用EXPLAIN指令来查看执行情况:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ylUCXvur-1598535462135)(/Users/dzzhyk/Desktop/apeBook/src/image-20200810223459201.png)]

可以看到,type已经变为了range类型,说明查询速度得到了一定的提升,但是仍然存在文件内排序的情况

这是因为,使用了<>!判断条件之后的索引会产生失效问题,所以cpa顺序的索引第三个age其实并没有生效,所以实际上的排序是另外进行的

为了继续优化这种情况,其实就是123的顺序过程中2断掉了,所以出现了3的排序用不上,从而出现了内排序的情况,所以这次我们直接把2号删除,只有city,age两列建立索引,这样就能避免索引失效的情况

首先先把上一个索引删除:

drop index index_cpa on t_ttpai;

然后建立新的复合索引:

alter table t_ttpai add index index_ca (city, age) using btree;

再次运行相同的SQL:

在这里插入图片描述

这次type类型来到了ref级别,并且避免了文件内排序的情况发生

双表案例

结论:

左连接 left join 在右表相应字段建立索引,可以优化查询,在左表字段建立索引效果不明显,因为是左连接,左边至少要全部扫描一次

右连接反之

三表案例

三表或者多表,如果使用了join进行连接查询,原则是小表驱动大表,然后在大表经常查询字段上建立索引

索引失效

MySQL优化之索引优化_第2张图片

MySQL优化之索引优化_第3张图片

  • group by 之前必定要进行排序,此时使用索引顺序失误会导致产生临时表和内排序

你可能感兴趣的:(MySQL,mysql,sql,索引,数据库)