1、sql优化:
原因:性能低,执行时间太长,等待时间太长、sql语句欠佳,索引失效、服务器参
数设置不合理
编写过程:
select distinct from join on where group by having order by limit
解析过程:
from on join where group by having select distinct order by
2、sql优化: 优化索引
索引:index 帮助mysql高效获取数据的数据结构(B树、hash树、B+树)
mysql使用B树
有一个主节点 小于主节点的在左边 大于主节点的在右边,呈(二叉树)树状分布
3、索引
分类:
单值索引:单列 加索引,一个表可以有多个单值索引
唯一索引:不能重复。eg:id
复合索引:多个列构成的索引(相当于二级目录)
创建索引:
create 索引类型 索引名 on 表(字段)
alter table 表名 索引类型 索引名(字段)
单值:
create index dept_index on tb(name)
alter table tb add index(name)
唯一:
create unique index name_index on tb(name)
alter table tb add unique index(name)
复合索引:
create index dept_name on tb(id,name)
alter table tb add index(id,name)
删除索引:
drop index 索引名 on 表名;
drop index name ob tb
查询索引:
show index from 表名;
4、sql性能问题
1、分析sql执行计划
expalin 模拟sql优化器 执行sql语句,从而让开发人员知道自己编写的sql
(1)id:id值相同,从上往下依次执行;id值不同,id越大越优先执行;id值有相同又有不同,id值越大越优先,id值相同,从上往下一次执行。
(2)select_type:查询类型
primary: 包含子查询sql的子查询(最外层)
subquery:包含子查询sql的子查询(非最外层)
simple:简单查询(不包含子查询,union)
derived:衍生查询(使用到了临时表)
1、在from中只用到了一张表
2、在from中两张表 tb1 union tb2, tb1就是dervied
union:如上
union result:告知开发人员那些表之间存在union查询
(3)type:索引类型
system>const>eq_ref>ref>range>index>all, 前提:必须有索引
其中system const 是理想型,实际能达到ref>range
system只有一条数据的系统表 或者衍生表只有一条的主查询
const:仅仅能查到一条数据的sql,用于primary key或者unique索引(索引与
索引类型有关系)
eq_ref:对于每个索引建的查询,返回唯一值
ref:非唯一性索引,对于每个索引列的查询,返回0或多行
range:范围查询,where之后是in(有时候会失效,转为all查询) >,<= ,between,
index:查询全部索引的数据
all:查询全部表中的数据
(4)possible_key:可能用到的索引,并不确定
(5)key:实际用到的索引
(6)key_len:索引的长度,用来判断符合索引是否被完全使用(a,b,c)
(7)ref:表之间的关系
(8)rows:被索引优化查询的数据个数(实际通过索引查询到的数据个数)
(9)Extra:
using filesort:性能消耗大,需要额外的一次排序(查询)
避免方法:where和order by按照复合索引的顺序使用,不要跨列
或者无序使用,一般常见于order by语句中
useing temporary:性能消耗大,用到了临时表。一般出现在
group by语句汇总