MYSQL优化

一、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 (需要回表查询)

 

你可能感兴趣的:(MYSQL优化)