1 什么是索引
什么是索引(Index)。数据库中的索引,就好⽐⼀本书的目录,它可以帮我们快速进行特定 值的定位与查找,从而加快数据查询的效率。
2 索引的类型
- 主键索引
- 非空索引
- 唯一索引
- 全文索引
- 普通索引
唯一索引
:在创建唯一索引时要不能给具有相同的索引值。在⼀张数据表⾥可以有多个唯⼀索引。
主键索引
:在我们给一个字段设置主键的时候,它就会自动创建主键索引,用来确保每一个值都是唯一的。⼀张表⾥最多只有⼀个主键索引。
聚集索引
:我们在表中添加数据的顺序,与我们创建的索引键值相同,而且一个表中只能有一个聚集索引。
普通索引
:它的结构主要以B+树和哈希索引为主,主要是对数据表中的数据进行精确查找。
全文索引
:它的作用是搜索数据表中的字段是不是包含我们搜索的关键字,就像搜索引擎中的模糊查询。
3 索引的好处
提高数据的搜索速度
加快表与表之间的连接速度
在信息检索过程中,若使用分组及排序子句进行时,通过建立索引能有效的减少检索过程中所需的分组及排序时间,提高检索效率。
4 索引的坏处
在我们建立数据库的时候,需要花费的时间去建立和维护索引,而且随着数据量的增加,需要维护它的时间也会增加。
在创建索引的时候会占用存储空间。
在我们需要修改表中的数据时,索引还需要进行动态的维护,所以对数据库的维护带来了一定的麻烦。
5 什么时候需要索引?什么时候又不需要索引?
5-1 需要索引
1.主键自动建立唯一索引
2.频繁作为查询条件的字段应该创建索引
3.查询中排序的字段创建索引将大大提高排序的速度(索引就是排序加快速查找
4.查询中统计或者分组的字段;
5.一般来说,在WHERE和JOIN中出现的列需要建立索引,但也不完全如此,因为MySQL只对<,<=,=,>,>=,BETWEEN,IN,以及某些时候的LIKE才会使用索引。刚才提到只有某些时候的LIKE才需建立索引。因为在以通配符%和_开头作查询时,MySQL不会使用索引。
5-2 什么时候不需要?
- 频繁更新的字段不适合创建索引,因为每次更新不单单是更新记录,还会更新索引,保存索引文件
- where条件里用不到的字段,不创建索引;
- 表记录太少,不需要创建索引;
- 经常增删改的表;
5.数据重复且分布平均的字段;些数据包含大量重复数据,因此他建立索引就没有太大的效果,例如性别字段,只有男女,不适合建立索引。
6 索引的操作
6-1 创建
创建普通索引
--CREATE INDEX index_name ON table_name(col_name);
--创建唯一索引
CREATE UNIQUE INDEX index_name ON table_name(col_name);
--创建普通组合索引
CREATE INDEX index_name ON table_name(col_name_1,col_name_2);
--创建唯一组合索引CREATE UNIQUE INDEX index_name ON table_name(col_name_1,col_name_2);
通过修改表结构来创建
ALTER TABLE table_name ADD INDEX index_name(col_name);
创建表时候直接创建
CREATE TABLE table_name (
ID INT NOT NULL,col_name VARCHAR (16) NOT NULL,
INDEX index_name (col_name)
);
6-2 索引的删除
--直接删除索引
DROP INDEX index_name ON table_name;
--修改表结构删除索引
ALTER TABLE table_name DROP INDEX index_name;
7 相关sql命令
查看表结构
desc 表名字
查看表创建的sql
show create table table_name;
查看索引
show index from table_name;
8 其它注意事项
避免使用select *- count(1)或count(列) 代替 count(*)
- 创建表时尽量时 char 代替 varchar
- 表的字段顺序固定长度的字段优先
- 组合索引代替多个单列索引(经常使用多个条件查询时)
- 尽量使用短索引
- 使用连接(JOIN)来代替子查询(Sub-Queries)- 连表时注意条件类型需一致- 索引散列值(重复多)不适合建索