MySQL 如何读写数据?https://blog.csdn.net/weixin_43551213/article/details/140862538
MySQL 索引https://blog.csdn.net/weixin_43551213/article/details/140847916
在上一篇文章中提到了索引,而添加索引是优化 SQL 语句的一个方式,但是什么时候需要添加索引呢?
在 mysql 可以使用 explain 关键字查看 sql 语句的执行计划,而根据执行计划便可以制定对应的优化方案
首先,我们先执行以下 sql 语句:
sql
EXPLAIN SELECT * FROM product WHERE productId = "81301125340733440"
可以看出,在结果中有多个字段,接下来就对一些关键字段进行解析:
|---------------|-----------------|--------------|
| 字段 | format=json时的名称 | 说明 |
| id | select_id | 该语句的唯一标识 |
| select_type | / | 查询类型 |
| table | table_name | 表名 |
| partitions | partitions | 匹配的分区 |
| type | access_type | 联接类型 |
| possible_keys | possible_type | 可能的索引选择 |
| key | key | 实际选择的索引 |
| key_len | key_length | 索引的长度 |
| ref | ref | 索引的哪一列被引用了 |
| rows | rows | 估计要扫描的行数 |
| filtered | filtered | 符合查询条件的数据百分比 |
| Extra | / | 附加信息 |
id 字段
id 表示执行 select 查询语句的序号,它是 sql 执行的顺序的标识,sql 按照 id 从大到小执行,id 相同的为一组,从上到下执行。
type 字段
type 字段表示的 sql 关联的类型或者说是访问的类型。
从这个字段中我们可以确定这条sql查找数据库表的时候,查找记录的大概范围是怎么样的,直接就能体现sql的效率问题。
type 字段的类型也是有比较多,主要常见掌握的有以下几个:system、const 、eq_ref 、ref 、range 、index 、ALL。
它的性能体现是从高到低。system > const > eq_ref > ref > range > index > ALL
|--------|--------------------------------------------------------------------------------------------------------------------------------|
| 类型 | 说明 |
| system | system 是 const 的特例,「表示表中只有一行记录」 |
| const | const 表示通过索引一次就查找到了数据,一般 const 出现在**「唯一索引或者主键索引中使用等值查询」,因为表中只有一条数据匹配,所以查找的速度很快 |
| eq_ref | eq_ref表示「使用唯一索引或者主键索引扫描作为表链接匹配条件,对于每一个索引键,表中只有一条记录与之匹配」** |
| ref | ref性能比eq_ref差,「也表示表的链接匹配条件,也就是使用哪些表字段作为查询索引列上的值」 |
| range | range**「使用索引来检索给定范围的行数据,一般是在 where 后面使用 between、<>、in 等查询语句就会出现 range」** |
| index | 「index表示会遍历索引树」,index 会比 ALL 速度快一些,但是出现 index 说明需要检查自己的索引是否使用正确 |
| ALL | 「ALL 与 index 的区别就是 ALL 是从硬盘中读取,而 index 是从索引文件中读取」,ALL 全表扫描意味着 Mysql 会从表的头到尾进行扫描,这时候表示通常需要增加索引来进行优化了,或者说是查询中并没有使用索引作为条件进行查询 |
ref 与 eq_ref 的区别就是:
- eq_ref 使用的是唯一索引或者主键索引
- ref 扫描后的结果可能会找到多条符合条件的行数据,本质上是一种索引访问,返回匹配的行
Extra 字段
该字段显示的是 sql 查询的额外信息,主要有以下几种情况:
Using index、Using where、Using temporary、Using temporary、Using join buffer、Impossible where、Select tables optimized away
Using index
表示查询的列被索引覆盖
,这个是查询性能比较高的体现,即所要查询的信息搜在索引里面可以得到,不用回表,索引被正确的使用
假如同时出现了using where,表示索引用于执行索引键值的查找;若是没有出现using where,则表示索引用于读取数据,而非执行查询的动作。
Using index condition
表示只用到了索引下推
的条件。即在组合索引中涵盖的列中覆盖了搜索条件,那么会在筛选出来前先用条件过滤一遍,再去回表,减少回表次数
Using where
该属性与 Using index 相反,查询的列并没有被索引覆盖,where 条件后面使用的是非索引的前导列,它仅仅是使用了 where 条件而已
Using temporary
Using temporary 表示使用了临时表存储中间的结果,一般在对结果排序的时候会使用临时表
Using filesort
Using filesort 表示文件排序,说明 Mysql 对数据使用了外部的索引进行排序,并没有使用表中的索引进行排序
Using join buffer
Using join buffer 表示使用连接缓存
它强调在获取连接条件时,并没有使用索引,而是使用连接缓冲区来存储中间结果,若是出现该值,一般说明需要添加索引来进行优化了
Select tables optimized away
表示 select 语句没有遍历表或者索引就返回数据了
一 叶 知 秋,奥 妙 玄 心