一、索引的声明与使用
1.1索引的分类
功能逻辑:普通索引,主键索引,唯一索引,全文索引
物理实现方式:聚簇索引和非聚簇索引
作用字段个数:单列索引和联合索引
1.普通索引
对表中的任何字段都可以创建,没有限制条件。如:student表中的name字段建立一个普通索引,查询记录时根据索引进行查询
2.唯一性索引
使用unique参数设置唯一性索引,唯一可为空,一个表有多个唯一性索引。如:student表中的email字段创建唯一索引
3.主键索引
一个表中最多有一个主键(非空且唯一),只能有一个主键索引。因为主键索引是物理实现方式决定的,数据存储在文件中按照一种顺序存储
4.单列索引
作用于单个字段的索引
5.组合索引
多个字段的组合创建一个索引,使用组合索引遵循最左前缀集合。如:id和name建立一个索引idx_id_name
6.全文索引
全文索引只能创建在char,varchar,text类型字段上。查询数据量大的字符串使用全文检索提高效率。如student表值information是text类型。
7.总结
1.2创建索引
创建表添加索引:create table 表名(index(字段名));
修改表添加索引:alter table 表名 add index(字段名)
1. 创建表添加索引
【格式】
①有主键约束,唯一约束,外键约束,自动创建索引
CREATE TABLE dept(
dept_id INT PRIMARY KEY AUTO_INCREMENT,
dept_name VARCHAR(20)
);
CREATE TABLE emp(
emp_id INT PRIMARY KEY AUTO_INCREMENT,
emp_name VARCHAR(20) UNIQUE,
dept_id INT,
CONSTRAINT emp_dept_id_fk FOREIGN KEY(dept_id) REFERENCES dept(dept_id)
);
②创建普通索引
创建表最后时,添加index(字段名)
CREATE TABLE book(
book_id INT ,
book_name VARCHAR(100),
authors VARCHAR(100),
info VARCHAR(100) ,
comment VARCHAR(100),
year_publication YEAR,
INDEX(year_publication)
);
命令查看索引:
show create table book;
或
show index from book;
③创建唯一索引
CREATE TABLE test1(
id INT NOT NULL,
name varchar(30) NOT NULL,
UNIQUE INDEX uk_idx_id(id)
);
④主键索引:创建主键时自动创建
create table student(
id int(10) primary key,
no varchar(10),
name varchar(20)
);
查看索引
show index from student
删除索引
alter table student
drop primary key
修改索引:必须先删除掉(drop)原索引,再新建(add)索引
⑤创建组合索引
create table book2(
id int,
name varchar(100),
authors varchar(100),
index mul_id_name_(id,name)
);
2. 修改表添加索引 add index(字段名)
3.删除表的索引
删除表中的列对删除对应的索引
二、索引的设计原则
1.哪些情况适合创建索引
①有唯一限制的字段
如:学生表的学号是唯一的,为该字段创建唯一索引很快确定某个学生的信息,使用姓名查询会存在同名现象,降低查询速度
②频繁where查询条件的字段
某个字段在SELECT语句的 WHERE 条件中经常被使用到,那么就需要给这个字段创建索引了。尤其是在数据量大的情况下,创建普通索引就可以大幅提升数据查询的效率。
③经常group by和order by的字段
提高分组和排序查询
索引就是让数据按照某种顺序存储,使用group by和order by需要对分组或者排序进行索引
④对更新,删除的where条件列
在进行更新或删除的时候,我们需要根据where条件列检索出这条记录,对他更新和删除。如果更新的是非索引字段,效率会更明显,更新后不需要对索引进行维护
⑤distinct去重字段需要创建索引
对某个字段进行去重,使用distinct,对这个字段创建索引,提升查询效率。因为会根据这个去重字段进行排序,相同的都在一块,所以查询速度变快
⑥多表join查询的时候注意事项
表不要超过3张,对where条件创建索引,对连接字段创建索引类型要一致。
⑦使用列的类型小的创建索引
数据类型越小,索引占用内存越少,一个数据页放下更多的记录,查询速度快。适用于主键
⑧使用字符串的前缀创建索引
字符串很长,创建索引占空间大,所以需要截取前面一部分,叫做前缀索引。
虽然查找记录不能精准的定位到记录的位置,但是能定位相应的前缀所在的位置,然后根据主键值进行回表查询。
选择字符串长度的公式:
count(distinct left(列名, 索引长度))/count(*)
越接近于1,说明的重复的低,接近于唯一性。此刻的索引长度最好。一般字符串类型的数据,长度为20的索引,区分度达90%以上。前缀索引排序可能不准确
⑨区分度高的列适合作为索引,数据重复低的
count(distinct left(列名, 索引长度))/count(*)
越接近于1,说明的重复的低,接近于唯一性。此刻的索引长度最好。超过33%比较好的索引。
⑩联合索引:频繁的列在左
【补充】联合索引比单值索引效果好
2.限制索引的数目,单表不超过6个
①索引占磁盘空间,索引多,磁盘空间就越大
②索引影响更新操作(增删改),表中数据修改,索引会修改
③优化器在优化查询的时候,通过索引进行评估,多个索引,增加优化器的执行计划时间,降低查询性能。
3.哪些情况不适合创建索引
①where条件中使用不到的字段,不要设置索引。索引的价值是快速定位,起不到作用的不用索引
只对student_id创建索引就可以,其他字段不需要
②数据量小的表最好不要使用索引
记录小于1000,是否创建索引对查询效率影响不大
③有大量重复数据的字段不适合建立索引
④经常更新的表不要创建过多的索引
更新数据的时候,也要更新索引,索引提高了查询效率,但是降低了更新效率。
⑤不用无序的值作为索引
比如:身份证,UUID
3.小结
索引能提高查询效率,但是降低插入和更新的速度并占内存。
选择索引的最终目的是为了查询速度变快