一、MySQL的逻辑分层
连接层:提供与客户端连接的服务;
服务层:1、提供用户各种使用的接口,如:select等;
2、提供SQL优化器(MySQL Query Optimizer);
引擎层:提供了各种存储数据的方式{InnoDB(默认) :事务优先 (适合高并发操作;行锁)、MyISAM:性能优先 (表锁)};
存储层:存储数据。
1.1、查询和设置引擎
查询数据库支持的引擎:show engines ;
查看当前使用的引擎:show variables like ‘%storage_engine%‘ ;
指定数据库对象的引擎:
create table tb( id int(4) auto_increment , name varchar(5), dept varchar(5) , primary key(id) )ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 ;
1.2、数据结构B+树简介
一个m阶的B树有如下特征:
1.根结点至少有两个子女。
2.每个中间节点都包含k-1个元素和k个孩子,其中 m/2 <= k <= m
3.每一个叶子节点都包含k-1个元素,其中 m/2 <= k <= m
4.所有的叶子结点都位于同一层。
5.每个节点中的元素从小到大排列,节点当中k-1个元素正好是k个孩子包含的元素的值域分划。
而m阶的B+树则具备如下特征:
1.有k个子树的中间节点包含有k个元素(B树中是k-1个元素),每个元素不保存数据,只用来索引,所有数据都保存在叶子节点。
2.所有的叶子结点中包含了全部元素的信息,及指向含这些元素记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。
3.所有的中间节点元素都同时存在于子节点,在子节点元素中是最大(或最小)元素。
二、SQL优化
2.1、产生的原因:原因:性能低、执行时间太长、等待时间太长、SQL语句欠佳(连接查询)、索引失效、服务器参数设置不合理(缓冲、线程数)
SQL语句的编写顺序:
select —— distinct —— from —— join —— on —— where —— group by —— having —— order by —— limit
SQL解析的顺序:
from —— on —— join —— where —— group by —— having —— select —— dinstinct —— order by —— limit
2.2、索引
索引: index是帮助MYSQL高效获取数据的数据结构。
索引的弊端:
1.索引本身很大, 可以存放在内存/硬盘(通常为 硬盘)
2.索引不是所有情况均适用: a.少量数据 b.频繁更新的字段 c.很少使用的字段
3.索引会降低增删改的效率(增删改 查)
优势:1提高查询效率(降低IO使用率)
2.降低CPU使用率 (...order by age desc,因为 B树索引 本身就是一个 好排序的结构,因此在排序时 可以直接使用)
三、索引
3.1、分类:
主键索引:不能重复,一般使用id,不能是null
唯一索引:不能重复。id 可以是null
单值索引 : 单列, 一个表可以有多个单值索引
复合索引 :多个列构成的索引,遵循最左原则,当左侧条件唯一时忽略右侧条件
3.2、创建索引
如果一个字段是primary key,则改字段默认就是 主键索引
方式一:create 索引类型 索引名 on 表(字段)
单值:
create index dept_index on tb(dept);
唯一:
create unique index name_index on tb(name) ;
复合索引
create index dept_name_index on tb(dept,name);
方式二:alter table 表名 索引类型 索引名(字段)
单值:
alter table tb add index dept_index(dept) ;
唯一:
alter table tb add unique index name_index(name);
复合索引
alter table tb add index dept_name_index(dept,name);
3.3、删除、查询索引
删除索引:drop index 索引名 on 表名 ;
drop index name_index on tb ;
查询索引:show index from 表名 ;
四、SQL性能分析
explain+SQL语句 :展现查询的执行计划
4.1、select type
primary:主查询中包含子查询的最外层;
subquery:子查询;
simple:简单查询(即不包含子查询以及union联接查询);
derived:衍生查询(在查询过程中使用临时表)
a.在from子查询中只有一张表
explain select cr.cname from ( select * from course where tid in (1,2) ) cr ;
b.在from子查询中, 如果有table1 union table2 ,则table1 就是derived,table2就是union
explain select cr.cname from ( select * from course where tid = 1 union select * from course where tid = 2 ) cr ;
4.2、type 索引类型
system > const > eq_ref > ref > range > index > all
eq_ref:唯一性索引,对每个索引键的查询,返回匹配唯一行数据
ref:对每个索引键返回匹配的索引行
4.3、explain表格其他字段含义
key_len:索引的长度
ref:当前表参照的字段
rows:被索引优化查询的数据个数
4.4、extra
using filesort:性能消耗大,需要“额外”的一次排序(查询),常见于 order by 语句中。
对于单索引, 如果排序和查找是同一个字段,则不会出现using filesort;如果排序和查找不是同一个字段,则会出现using filesort;
复合索引:不能跨列(最佳左前缀),where和order by 按照复合索引的顺序使用,不要跨列或无序使用。
alter table test02 add index idx_a1_a2_a3 (a1,a2,a3) ; explain select *from test02 where a1=‘‘ order by a3 ; --using filesort explain select *from test02 where a2=‘‘ order by a3 ; --using filesort explain select *from test02 where a1=‘‘ order by a2 ; explain select *from test02 where a2=‘‘ order by a1 ; --using filesort
using temporary:性能损耗大 ,用到了临时表。一般出现在group by 语句中。
避免方法:查询哪些列,就根据哪些列 group by 。
using index :性能提升; 索引覆盖(覆盖索引)。原因:不读取原文件,只从索引文件中获取数据 (不需要回表查询只要使用到的列全部都在索引中,就是索引覆盖using index。
using where (需要回表查询)