之前对索引一直很迷茫,敲了一下,感觉好多了
-- 普通索引
-- 创建索引
create index index_socre on sc(score);
-- 创建表的时候直接指定索引
create table mytable2(
id int not null,
username varchar(20) not null,
index indexname (username)
);
-- 删除索引
drop index indexname on mytable2;
-- 可以在同一列加不同索引
create index indexxxxx on mytable(username);
create index indeyyyyy on mytable(username);
-- 唯一索引
-- 它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。
-- 如果是组合索引,则列值的组合必须唯一。它有以下几种创建方式:
-- 创建索引
create unique index index_uni_name on mytable(username,id);
-- 修改表结构
alter table mytable add unique index_uni_name2 (username(19),id);
-- 创建表的时候直接指定
create table mytable(
id int not null,
username varchar(20) not null,
unique indexname (username)
);
-- 使用ALTER 命令添加和删除索引
alter table mytable add primary key (id) ;-- 该语句添加一个主键,这意味着索引值必须是唯一的,且不能为NULL。
alter table mytable add unique index_uni_username(username);-- 这条语句创建索引的值必须是唯一的(除了NULL外,NULL可能会出现多次)。
alter table mytable add index index_age(age); -- 添加普通索引,索引值可以出现多次
alter table mytable add fulltext index_fulltext_ageandname(sex) ;-- 该语句指定了索引为
FULLTEXT ,用于全文索引。
alter table mytable add index (sex);-- 如不指定indexname 则默认indexname等于列名
alter table mytable drop index sex; -- 删除索引
alter table mytable drop primary key;-- 删除主键
-- 查询表内的索引
show index FROM mytable; \G
索引主要添加在常用列上,优化查询性能
-- 修改表名
alter table mytable rename mytable2;
-- 新增列
alter table mytable add column i int;
alter table mytable add k int;
alter table mytable add k int first;-- 添加到最前面
alter table mytable add k int after id;-- 添加到id后面
-- 修改列不为空 前提:这个列i都有值,否则修改失败
alter table mytable modify column i int not null;
alter table mytable modify k int not null;
-- 修改列类型
alter table mytable modify column i char(10);
alter table mytable modify k char(10);
-- 修改列名及类型 在change关键字之后,紧跟着的是你要修改的字段名,然后指定新字段名及类型。
alter table mytable change column i ii int;
alter table mytable change i ii int;
-- 修改列位置和类型
alter table mytable modify i int first;
alter table mytable modify i bigint after j;
-- 设置默认值
alter table mytable modify i bigint default 100;
-- 修改默认值
alter table mytable alter i set default 10000;
-- 删除默认值
alter table mytable alter i drop default;
-- 删除列
alter table mytable drop column i;
alter table mytable drop k;
-- 删除外键约束
alter table mytable drop foreign key keyname;
-- 修改存储引擎
alter table mytable engine = myisam;
-- 修改索引名称
ALTER TABLE mytable2 RENAME INDEX indexname TO idx_myt2_username;
-- 查看表设计
show columns from mytable;
-- 查看表结构
show table status like 'mytable2';
EXPLAIN
select count(*) from sc where score>60 and course in (select course from sc where teacher='叶平');
创建一个表,并填充数据
CREATE TABLE mytable2 (
id INT NOT NULL,
username VARCHAR ( 20 ) NOT NULL,
age INT NOT NULL,
sex VARCHAR ( 20 ) NOT NULL,
realname VARCHAR ( 20 ) NOT NULL,
pwd VARCHAR ( 20 ) NOT NULL,
INDEX indexname ( username )
);
insert into mytable2 values(null,'a',13,'boy','nm','2222');
insert into mytable2 values(null,'B',13,'boy','nm','2222');
insert into mytable2 values(null,'aa',13,'boy','nm','2222');
insert into mytable2 values(null,'c',13,'boy','nm','2222');
insert into mytable2 values(null,'d',13,'boy','nm','2222');
insert into mytable2 values(null,'e',13,'boy','nm','2222');
insert into mytable2 values(null,'a',13,'boy','nm','2222');
insert into mytable2 values(null,'a',13,'boy','nm','2222');
insert into mytable2 values(null,'f',13,'boy','nm','2222');
insert into mytable2 values(null,'a',13,'boy','nm','2222');
insert into mytable2 values(null,'g',13,'boy','nm','2222');
insert into mytable2 values(null,'a',13,'boy','nm','2222');
查看索引情况
show index from mytable2
-- 简单来说:就是where 没有索引列
explain select * from mytable2 where age=13 and sex='boy' and pwd='222';
-- 正确使用索引
explain select * from mytable2 where username='s';
-- 使用like后索引失效
explain select * from mytable2 where username like 's';
create index idx_myt2_age on mytable2(age);
-- 使用了计算索引失效
explain select * from mytable2 where age+1 = 1;
-- 使用了函数失效
explain select * from mytable2 where ifnull(age,0)=0;
-- username是varchar,这个sql需要把username转换为数字,导致索引失效
explain select * from mytable2 where username= 1;
-- 使用了=可以走索引,<>不能走索引
explain select * from mytable2 where age<>2;
explain select * from mytable2 where age!=2;
-- 使用了order by 导致索引失效
explain select * from mytable2 ORDER BY age;
-- 修改索引名称
ALTER TABLE mytable2 RENAME INDEX indexname TO idx_myt2_username;
-- 使用了or导致索引失效:以下分别是三种不同情况的or
-- or前后均为索引列,但不同索引
explain select * from mytable2 WHERE age=29 or username='22';
-- or 前后为同一索引列
explain select * from mytable2 WHERE age=29 or age=22;
-- or 前后存在非索引列
explain select * from mytable2 WHERE age=29 or pwd='22';
-- 前提条件:没有使用where
-- 1使用*查询
explain select * from mytable2;
-- 2查询包含索引列和非索引列
explain select username,pwd from mytable2;
-- 3单独一条索引列
explain select age from mytable2;
-- 4查询多个索引列
explain select age,username from mytable2;
-- 5查询主键
explain select id from mytable2;
-- 查询重复值过高的结果
explain select * from mytable2 WHERE age=13;
-- 查询重复值不高的结果
explain select * from mytable2 WHERE age=11;