这两天看了下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的索引即不会进行排序操作