mysql的逻辑分层:连接层 服务层 引擎层 存储层
引擎层主要分为两类:InnoDB、MyIsam(使用show engines;查看)
InnoDB是事务优先的,会进行行锁,适合高并发操作
MyIsam是性能优先的,进行表锁
sql优化点:等待时间长,执行时间长,性能低下,多表连接查询,服务器参数设置不合理(线程数、缓冲区)
编写过程 select ... from ... join... on ... where ... group by ... having... order by...
解析过程 from ... on ... join... where ...group by... having...select... order by...
具体内容可以看步步深入:MySQL架构总览->查询执行流程->SQL解析顺序 - AnnsShadoW - 博客园www.cnblogs.com
sql优化主要是优化索引,索引是一个高效查询数据的数据结构,索引一般是一颗树(树:b树或者hash树等)示例如下。
索引的弊端也是有的:索引本身需要空间可以存放内存或者硬盘内部;索引在有的情况下不适用:数据量少,频繁更新的数据,很少使用的字段,索引会提高查询但是减低增删改效率(但是数据库的大部分操作是查询,增删改较少)。
优势:提高查询效率(降低IO使用率)、降低CPU使用率(...order by xx desc,直接在B树排好了)。
B树在磁盘中的结构是怎么样的呢?
三层Btree可以存放上百万条数据,每一层可以超过两个分支。B树一般是值B+树,数据全部放到叶节点中,B+树中查询任意数据都是n次(n为树的高度)。
B树与B+树的区别,可以看以下文章https://blog.csdn.net/login_sonata/article/details/75268075blog.csdn.net
索引的分类:单值索引(单列,一个表可以有多个单值索引)、唯一索引(不能重复)、复合索引(多个列构成的索引,符合索引不一定是多个列全中)。
第一种
# 单值索引 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);
事务操作只对DML增删改有效,DDL会自动提交。
主键索引是唯一索引的一种,但是主键索引不能为null。
删除索引
drop index 索引名 on 表名
drop index name_index on tb;
SQL优化问题
1、分析SQL的执行计划:explain。可以模拟SQL优化器优化SQL执行语句。
2、mysql查询自动优化,会干扰优化。
explain一般返回这么几个字段:id,select_type,type
不过SQL执行计划不同版本不一样,看具体版本,不用纠结。
这里用explain返回结果时,id越大越先执行(本质是嵌套查询),id相同时,顺序执行。
select_type:primary(主查询)、subquery(子查询)、simple(简单查询,不包含子查询和union)、derived(衍生查询,用到了临时表。在from子查询中只有一张表,或者union前一个查询)
type:索引类型
一般system > const > eq_ref > ref > range > index > all性能依次降低,实际能达到ref > range即可。前提是必须建立索引。
这个理解即可。
eq_ref:查询结果1v1;ref:查询结果1vN(N>=0);range(where between,<=, >=,in等),其中in在查询数据在一半以上时,退化为all或index。尽量避免使用in;index:查某一索引字段的;all:全表所有字段或者没有索引的字段。
下期讲索引优化方案。