> 文章列表 > 【MySQL优化】快速入门慢SQL优化

【MySQL优化】快速入门慢SQL优化

【MySQL优化】快速入门慢SQL优化

MySQL

B+树结构(二叉排序树)

【MySQL优化】快速入门慢SQL优化

索引

SQL优化,主要就是在优化索引

索引:相当于书的目录

索引:index是帮助MYSQL高效获取数据的数据结构。索引是数据结构(树:B树(默认)、Hash树…)

索引的弊端:

1.索引本身很大,可以存放在内存/硬盘(通常为硬盘)

2.索引不是所有情况均适用:a.少量数据b.频繁更新的字段c.很少使用的字段

3.索引会降低增删改的效率(增删改 查)

优势:

1提高查询效率(降低IO使用率)

2.降低CPU使用率(…order by age desc, 因为B树索引本身就是一个排好序的结果)

主键索引(primary key)

唯一索引(unique index)

单值索引(index)

复合索引

create 索引类型 索引名 on 表名(表字段)

alter table 表名 索引类型 索引名(表字段)

explain

【MySQL优化】快速入门慢SQL优化

id

值相同,从上往下顺序执行,值不同,值越大的先执行

子连接,先执行最内括号里的

多表连接,表行数小的先执行

(原因:笛卡尔积,2 3 4,2 * 3 * 4 = 6 * 4 ,3 * 4 * 2 = 12 * 2)

6 < 12 效率高

select_type

查询类型

PRIMARY:包含子查询SQL中的主查询(最外层的)

SUBQUERY:包含子查询SQL中的子查询(非外层的)

SIMPLE:简单查询(不包含子查询、union)

DERIVED:衍生查询(使用到了临时表)

​ a. 在from子查询中只有一张表(select temp.xx from (selet …) temp)

​ b. 在from子查询中,如果有table1 union table2 ,则table1 就是 derived,table2就是union

UNION:上例

UNION RESULT:两张表

table

查询的是哪张表

type

索引类型、类型

system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery

System > const > eq_ref > ref > range > index > all

首先得有索引才能做优化,不然都是all

system、const只是理想情况,大多数是优化到ref、range级别

system

只有一条数据的系统表

或者

衍生表只有一条数据的主查询

子表只有一条数据

const

仅仅只能查到一条数据的SQL,用于primary key 或unique index

eq_ref

唯一性索引(unique,primary),对每个索引值,返回匹配唯一的行数据(有且只有1个,不能多,不能少)

3行对应3行,索引值对应

3对1 3对 4 不行

where 后面的字段就是查询的索引值

ref

非唯一性索引,对每个索引值,返回匹配所有行(有0,或多个)

range

范围查询,查询指定范围的所有行,where后面是一个范围查询

(between,>,<,>=,<=,in(跟数据量有关,大于数据量一半all))

index

查询全部索引中的数据

查询字段是索引,只需要扫描索引列

all

查询全部表中的数据

查询字段不是索引,要扫描全表

possible_key

可能用到索引键(表字段),可能会有多个,是一种预测

key

实际用到的索引键(表字段)

key_len

索引的长度

作用:判断复合索引是否被完全使用

(a,b,c)三个索引分别多少varchar(10)

utf8:varcahr 1字符=3字节

三个都使用是30、两个20

如果索引字段可以为空,那么len会+1,MySQL会使用一个字节用于标识

复合索引遵循最左匹配原则,在第一个索引能查到后,后面的索引就不起用了

编码

utf8:1个字符3个字节 (null是用一个字节标识,varchar可变长度用2个字节标识)

gbk:1个字符2个字节

latin:1个字符1个字节