mysql 优化

这两天看了下mysql的优化管理,

有几个重点记录下来:

EXPLAIN用于显示mysql的执行计划

其中type分为几种情况,比较常见的并且按照优化顺序来说:

const > eq_ref >ref>range>index

 

 

Table   Create Table                            
------  -----------------------------------------
user    CREATE TABLE `user` (                   
          `id` int(11) NOT NULL auto_increment, 
          `name` varchar(32) NOT NULL,          
          PRIMARY KEY  (`id`)                   
        ) ENGINE=InnoDB DEFAULT CHARSET=latin1  

 

假设其中user表中设定的主键为id

EXPLAIN
select * from user where id=2

 

id  select_type   table   type   possible_keys   key        key_len    ref     rows      extra
1    simple        user   const    primary       primary       4      const     1

 

const方式最快,具体概念可以查书,因为是通过主键查询,由于唯一性可以直接定位到该条,所以找到该记录不会再扫描该表,相当于一次性完成

 

CREATE TABLE `user_group` (            
              `user_id` int(11) NOT NULL,          
              `group_id` int(11) NOT NULL           
            )

CREATE INDEX index_name ON user_group (user_id)

 

EXPLAIN
select * from user_group where user_id=2

 

id  select_type   table   type   possible_keys   key        key_len    ref     rows      extra
1    simple        user_group    ref  index_name  index_name  4      const     1

 

ref方式是索引扫描

如果将user_id为唯一索引的话该扫描方式就是const方式。

 

 

EXPLAIN
select *
from user a ,user_group b
where a.id=b.user_id

首先需要了解mysql自带的优化器可以根据最优自动选择优化方式:

1.当两个表中的数据都少的话会出现

id  select_type   table   type   possible_keys   key        key_len    ref     rows      extra

                          b        all

                          a        all

情况即全扫描情况,此刻并没有使用索引。

 

 

2.当两个表数据量增多且user表大于user_group表时,优化器会自动处理的优化方式是:

id  select_type   table   type   possible_keys   key        key_len    ref     rows      extra

                          b        all

                          a        eq_ref

eq_ref是通过主键或者唯一为索引方式进行

 

3.当user_group表大于user表时,优化器选择的优化方式是:

id  select_type   table   type   possible_keys   key        key_len    ref     rows      extra

                          b        ref

                          a        all

以user_group表的索引方式进行

 

当然根据条件不同,优化器选择的方式会不同,这个要根据具体情况而来。

 

 

删除原先索引,增加现在索引

CREATE INDEX index_name ON user_group (group_id,user_id)

EXPLAIN
select *
from user_group
where user_id=2

 

id  select_type   table   type   possible_keys   key        key_len    ref     rows      extra

                          user_group        index                                                                  using where;using index

 

 

EXPLAIN
select *
from user_group
where user_id BETWEEN 0 and 5

 

id  select_type   table   type   possible_keys   key        key_len    ref     rows      extra

                          user_group        index                                                                  using where;using index

像上面的情况也可能是rang索引方式,这个取决于数据多少,所以根据具体情况分析

 

index扫描方式为全索引

 

 

EXPLAIN
select *
from user a
where a.id>2

 

id  select_type   table   type   possible_keys   key        key_len    ref     rows      extra

                          user      range

range索引范围扫描

 

 

另外每当建立一个索引,通过索引order by显示的均为经过排序的数据,即建立索引已经是针对该字段排序好的

EXPLAIN
select *
from user_group
order by group_id

由于没有对group_id即extra显示using filesort

如果增加了group_id的索引即不会进行排序操作

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