1,什么是索引
索引是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用指向数据,这就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。
将数据进行排序整理的过程就称为索引
2.MySQL索引分类
3①,从屋里层面来划分;聚集索引和非聚集索引
1.1 聚集索引 : 索引存储和数据的实际存储都是按照顺序的存储
-----> 一张表中只能有一个唯一的聚集索引
1.2 非聚集索引: 索引存储和数据的实际存储是没有顺序
一张表有多个非聚集索引
②,从实际应用上来划分
- 单值索引:该索引只能给单个列添加
- 组合索引: 该索引可以给多个列组合添加
- 主键索引: 给主键添加
- 唯一索引: 给唯一约束添加
唯一索引: 必须保证的数据是唯一的
唯一组合索引:必须保证组合的数据是唯一的!
说明:
1.我们创建表时就会指定主键和唯一约束,那么就相当于给表的字段添加了主键和唯一索引。
3.MySQL索引语法
1.创建索引
① 在已有表的字段上直接创建
-- 创建普通索引
CREATE INDEX 索引名 ON 表名(字段);
CREATE INDEX ind_emp_empname ON tb_emp(emp_name);
-- 创建唯一索引
CREATE UNIQUE INDEX 索引名 ON 表名(字段);
-- 创建普通组合索引
CREATE INDEX 索引名 ON 表名(字段1,字段2,...);
-- 创建唯一组合索引
CREATE UNIQUE INDEX 索引名 ON 表名(字段1,字段2,...);
说明:
1. 如果在同一张表中创建多个索引,要保证索引名是不能重复的
2. 上诉方式不能添加主键索引,也比较麻烦,需要指定索引名
②,在已有表的字段修改表时指定
-- 添加一个主键,这意味着索引值必须是唯一的,且不能为null
ALTER TABLE 表名 ADD PRIMARY KEY (字段); -- 默认索引名:primary
-- 添加唯一索引(除了NULL外,NULL可能会出现多次)
alter table 表名 add unique(字段); -- 默认索引名:字段名
-- 添加普通索引,索引值可以出现多次。
alter table 表名 add index(字段); -- 默认索引名:字段名
③,创建表时指定
CREATE TABLE student(
id INT PRIMARY KEY auto_increment, -- 主键索引
name VARCHAR(30),
phone VARCHAR(11) UNIQUE, -- 唯一索引
sex VARCHAR(5),
birthday DATE,
INDEX(name) -- 普通索引
);
2.查看索引
show index from 表名;
3.删除索引
1.直接删除
drop index 索引名 on 表名;
2. 修改表时删除
alter table 表名 drop index 索引名;
索引也会失效
在判断 != <> , 在模糊查询 条件中是以占位符开头
InnoDB(聚簇索引)
MySQL5.5版本之后默认存储引 . 特点:支持事务,支持外键约束
-- 创建 innodb存储引擎表
CREATE TABLE tab_innodb(
id INT,
name VARCHAR(32)
)ENGINE = INNODB; -- 这里不指定ENGINE = INNODB默认也是INNODB
上述表建好后,在对应的mysql安装目录的数据库下面会创建如下两个文件:
面试题:
1.你知道mysql有哪些索引
1.Mysql中常用的索引有B+树索引(包括普通索引,唯一索引,主键索引 )、哈希索引,全文索引(通过查找文本中的关键词,类似于搜索引擎),R-TREE索引(表示空间索引,myisam支持空间索引,空间索引主要用于地理空间数据类型,空间索引会从所有维度来索引数据。查询时,可以有效地使用任意维度来组合查询。很少使用)
2.Mysql 传统意义上的索引为B+ 树索引,B+ 树索引的本质就是B+ 树在数据库中的实现,数据库中的B+ 树的高一般为2-4层,因此查找某一键值的行记录只需2-4次IO,大概0.02~0.04秒。
2.非聚簇索引一定会回表查询吗?
不一定,这涉及到查询语句所要求的字段是否全部命中了索引,如果全部命中了索引,那么就不必再进行回表查询.
举个简单的例子,假设我们在员工表的年龄上建立了索引,那么当进行select age from employee where age < 20的查询时,在索引的叶子节点上,已经包含了age信息,不会再次进行回表查询.