第19章:索引的创建与设计原则

一、索引的声明与使用

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.小结

索引能提高查询效率,但是降低插入和更新的速度并占内存。

选择索引的最终目的是为了查询速度变快

猜你喜欢

转载自blog.csdn.net/jbkjhji/article/details/131224652