一 基础操作
-- 准备工作
-- 创建一个测试表
create table tb2(
id int UNSIGNED not null PRIMARY key auto_increment,
name VARCHAR(30)
);
desc tb2; -- 查看表结构
-- 索引基本操作
create index in_name on tb2(name);-- 创建索引
show index from tb2; -- 查看索引
drop index in_name on tb2; -- 删除操作
另外一种创建方法:
alter table company add index in_age(age); --新增索引
alter table company drop index in_age;--删除索引
二 索引优化解析
-- 基础数据准备
insert into tb2(name) values("user1");
insert into tb2(name) values("user1");
insert into tb2(name) values("user1");
insert into tb2(name) values("user2");
insert into tb2(name) values("user3");
insert into tb2(name) values("user4");
insert into tb2(name) values("user4");
-- desc + 查询语句定位
select * from tb2;
desc select * from tb2; -- 定位分析查询语句的执行计划
注意:这里的结果集
- rows:查询影响行数!
- select_type:查询类型,单表查询还是多表查询
simple--简单表
primary--主查询即外层查询
union union中的第二个或者后面的查询语句
subquery --子查询中的第一个select - table 输出结果集的表
- type:表示表的链接类型 性能由好到差
sysem--表仅一行
const--只一行匹配
eq_ref对于前面的每一行使用主键和唯一
ref--同eq_ref但是没有使用主键和唯一
ref_or_null--同前面对null查询
index_merge--索引合并优化
unique_subquery--主键子查询
index_subquery--非主键子查询
range--表单中的范围查询
index--都通过查询索引来得到数据
all--全表扫描 - possible_keys 表查询过程中可能使用的索引
- key 表示实际使用的索引
- key_len 索引长度
- extra 执行情况的说明和描述
- ref null
--举个栗子
还是使用上面的表
desc select * from tb2 where name="user1";
结果:
这里最明显的是rows,影响行数为7行。
下面对name加索引:
create index in_name on tb2(name);-- 创建索引
show index from tb2; -- 查看索引
然后再执行 查询计划:
desc select * from tb2 where name="user1";
得到的结果:
这里最明显的是rows,影响行数为3行。
比较一下前后两个查询结果,rows变化最明显。试想如果有10位数的查询结果,不加索引的影响行数和加了索引的影响行数天差地别。效率自然而升!
另外这种方式主要针对mysql的engine为MyISAM的情况。
修改engine:alter table company engine=myisam;
查看engine:show create table company;