mysql之索引练习

之前对索引一直很迷茫,敲了一下,感觉好多了

mysql索引练习

-- 普通索引

-- 创建索引
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 

mysql之索引练习_第1张图片

  1. 不符合最左匹配原则:这些没有从最左边开始,最后查询没有用到索引,用的是全表扫描
-- 简单来说:就是where 没有索引列
explain select * from mytable2 where age=13 and sex='boy' and pwd='222';

type为ALL,即:全表扫描mysql之索引练习_第2张图片

  1. 不正确的like查询
-- 正确使用索引
explain select * from mytable2 where username='s';
-- 使用like后索引失效
explain select * from mytable2 where username like 's';

mysql之索引练习_第3张图片mysql之索引练习_第4张图片

  1. 对索引列使用了计算或使用了函数
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;

在这里插入图片描述

  1. 索引进行了类型转换
-- username是varchar,这个sql需要把username转换为数字,导致索引失效
explain select * from mytable2 where username= 1;

mysql之索引练习_第5张图片

  1. <>不等于导致索引失效
 -- 使用了=可以走索引,<>不能走索引
explain select * from mytable2 where age<>2;
explain select * from mytable2 where age!=2;

mysql之索引练习_第6张图片mysql之索引练习_第7张图片

  1. 使用了order by 导致索引失效
-- 使用了order by 导致索引失效
explain select * from mytable2 ORDER BY age;

mysql之索引练习_第8张图片

  1. 使用了or导致索引失效
-- 修改索引名称
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';

mysql之索引练习_第9张图片mysql之索引练习_第10张图片
mysql之索引练习_第11张图片
8. 没有where 条件时,使用* 索引失效

-- 前提条件:没有使用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;

mysql之索引练习_第12张图片
mysql之索引练习_第13张图片mysql之索引练习_第14张图片
mysql之索引练习_第15张图片
mysql之索引练习_第16张图片
扩展
mysql之索引练习_第17张图片

  1. 查询数据过多导致索引失效
-- 查询重复值过高的结果
explain select * from mytable2 WHERE age=13;
-- 查询重复值不高的结果
explain select * from mytable2 WHERE age=11;

mysql之索引练习_第18张图片mysql之索引练习_第19张图片

你可能感兴趣的:(SQL,mysql优化,索引)