数据库的约束与索引
文章目录
- 数据库的约束与索引
- 一、约束
- 1、定义
- 2、主键索引
- 3、唯一约束
- 4、非空约束
- 5、外键约束
- 二、索引
- 1、定义
- 2、主键索引
- 3、唯一索引
- 4、普通索引
- 5、全文索引
- 三、深入索引
- 面试题(一)
- 面试题(二)
- 面试题(三)
- 面试题(四)
- 面试题(五)
一、约束
1、定义
数据库的约束是指对数据库表中的数据施加的一些规则或限制,以确保数据的完整性和一致性。
2、主键索引
2.1、 理解:唯一约束+非空约束,该字段上的数据不能重复且不能为null。
2.2、 注意:一张表必须有且只有一个主键
2.3、 添加主键约束
CREATE TABLE USER(username VARCHAR(32) PRIMARY KEY,PASSWORD VARCHAR(32),nick_name VARCHAR(32),name VARCHAR(32),age INT(3),salary DECIMAL(20,2)
);
2.4、 删除主键约束
ALTER TABLE user DROP PRIMARY KEY;
3、唯一约束
3.1、 定义: 唯一约束是指定table的列或列组合不能重复,保证数据的唯一性
3.2、 理解:该字段上的数据不能重复,但可以为null
3.3、 注意:同一个表可以有多个唯一约束,多个列组合的约束。
在创建唯一约束时,如果不给唯一约束名称,就默认和列名相同。
唯一约束不仅可以在一个表内创建,而且可以同时多表创建组合唯一约束。
3.4、 创建唯一约束
ALTER TABLE user add UNIQUE(phone);
3.5、 删除唯一约束
ALTER TABLE user DROP INDEX phone;
4、非空约束
4.1、 理解:该字段上的数据不能为null,但可以重复
4.2、 添加非空约束
ALTER TABLE user MODIFY PASSWORD VARCHAR(32) not NULL;
4.3、 删除非空约束
ALTER TABLE user MODIFY PASSWORD VARCHAR(32) NULL;
4.4、 需求:设置password字段为非空字段,设置默认值为’000000’
ALTER TABLE user MODIFY PASSWORD VARCHAR(32) NOT NULL DEFAULT '000000';
5、外键约束
5.1、 理解:外键约束是保证一个或两个表之间的参照完整性,外键是构建于一个表的两个字段或是两个表的两个字段之间的参照关系
5.2、 创建外键约束
ALTER TABLE user ADD FOREIGN KEY(notionality_id) REFERENCES nationality(id);
5.3、 删除外键约束
注意:外键名使用SHOW CREATE TABLE user;查看
ALTER TABLE USER DROP FOREIGN KEY user_ibfk_1;
二、索引
1、定义
数据库索引(Index) 是一种辅助数据结构,存储在数据库中,旨在提高数据检索的速度。索引通常以B树或哈希表的形式实现。通过创建索引,可以显著减少数据查找的时间复杂度,从而提升查询效率。
理解:相当于一本书的目录,让查询变得更快
2、主键索引
2.1、 理解:主键作为约束,让该字段上的数据不能为重复且不能为空;主键作为索引,让该字段的数据作为条件查询更快
2.2、 添加主键索引
CREATE TABLE student(id INT(3) PRIMARY KEY auto_increment,name VARCHAR(32),sex VARCHAR(32),age INT(3),salary FLOAT(8,2),course VARCHAR(32)
2.3、 删除主键索引
alter table student drop primary key;
3、唯一索引
3.1、 理解:唯一作为约束,让该字段上的数据不能重复但可以为null;唯一作为索引,让该字段的数据作为条件查询更快
3.2、 创建唯一索引
alter table student add unique(name);
3.3、删除唯一索引
alter table student drop index name;
4、普通索引
4.1、 理解:普通索引上的数据没有任何约束,可以重复也可以为null;普通索引让字段的数据作为条件查询更快
4.2、 添加普通索引
ALTER TABLE student ADD INDEX(age);
4.3、删除普通索引
drop index age on student;
5、全文索引
拓展:PARSER ngram - 添加ngram解析器(该解析器可以解析中文、日文、韩文)
5.1、 添加全文索引
ALTER TABLE news ADD FULLTEXT(info) WITH PARSER ngram;
5.2、 利用全文索引去查询
SELECT * FROM news WHERE MATCH(info) against('胡歌很帅');
5.3、 删除全文索引
drop index info on news;
三、深入索引
面试题(一)
索引的底层数据结构是什么?索引是如何实现的?
答:索引的底层数据结构是B+tree(多路树);当设置了字段为索引以后,底层会将字段上的数据使用B+Tree的数据结构存储在索引文件里
面试题(二)
索引的优缺点?
答:优点:索引字段作为条件查询更快;
缺点:添加、删除数据会改变表,也会改变索引文件里的数据结构
解决方案:少量的添加、删除就直接忽略,批量添加、删除之前可以把所有删除,批量操作后再把所有添加上
面试题(三)
索引的分类?
答:聚簇索引/聚集索引:主键索引
非聚簇索引/非聚集索引:唯一索引、普通索引、全文索引
面试题(四)
聚簇索引与非聚簇索引的区别?
答: 聚簇索引:叶子节点上存放的是数据行的数据
非聚簇索引:叶子节点存放的是数据行的地址(拿到地址后,还要去找地址上的数据)
面试题(五)
索引什么情况下会失效?
答:
– 1、查询条件中包含or
– 2、like 通配符% 错误使用
– 3、联合索引最左匹配原则
– 4、索引列使用MySQL函数,索引失效
– 5、索引列存在计算,使用(+、-、*、/),索引失效
– 6、使用(!= 或者 < >,not in),导致索引失效
– 7、使用is null, is not null,导致索引失效
– 8、左连接、右连接关联字段编码不一致,索引失效
– 9、使用了select ,导致索引失效
– 10、order by使用,导致索引失效
3、联合索引最左匹配原则
– 4、索引列使用MySQL函数,索引失效
– 5、索引列存在计算,使用(+、-、、/),索引失效
– 6、使用(!= 或者 < >,not in),导致索引失效
– 7、使用is null, is not null,导致索引失效
– 8、左连接、右连接关联字段编码不一致,索引失效
– 9、使用了select *,导致索引失效
– 10、order by使用,导致索引失效
– 11、group by 使用违反最左匹配原则,导致索引失效