外键、索引
1 外键
在students表中,通过class_id的字段,可以把数据与classes表关联起来,这种列称为外键。
用于定义出一对多关系,一个班级对应多个学生。
外键并不是通过列名实现的,而是通过定义外键约束实现;
通过定义外键约束,关系数据库可以保证无法插入无效的数据,如:
classes表不存在id=99的记录,students表就无法插入class_id=99的记录。
ALTER TABLE students
ADD CONSTRAINT fk_class_id //外键约束的名称 fk_class_id 可以任意
FOREIGN KEY (class_id) //指定了class_id作为外键
REFERENCES classes (id); //指定class_id外键关联到
//classes表的id列(即classes表的主键)
删除外键约束:
ALTER TABLE students
DROP FOREIGN KEY fk_class_id;
2 多对多
多对多关系,通过一个中间表,关联两个一对多关系,来形成:
3 一对一
一些应用会把一个大表拆成两个一对一的表,目的是把经常读取和不经常读取的字段分开,以获得更高的性能。
如:用户表分拆为 user_info表 、user_profiles表,大部分时候,只需查询user_info表,并不需要查询user_profiles表,这样就提高了查询速度。
4 索引
如果有上万甚至上亿条记录,就需要使用索引。
索引 对 单或多个列的值 进行预排序。
可让数据库系统 直接定位到符合条件的记录,加快了查询速度。
如score列进行查询 频率高,可对 score列 创建索引:
ALTER TABLE students
ADD INDEX idx_score (score); //多列 :idx_name_score (name, score)
索引的效率取决于索引列的值是否散列, 列的值越互不相同,效率越高。
(主键效率最高,自动创建索引)
但例如gender列,一半值是M,一半是F,大量相同值,对该列创建索引没有意义。
缺点:
插入、更新和删除记录时,需修改索引。
索引越多,插入、更新和删除记录的速度就越慢。
唯一索引
身份证号、邮箱地址等, 具有业务含义,不宜作为主键。
但具有唯一性约束,适合添加一个唯一索引。
假设students表的name不能重复:
ALTER TABLE students
ADD UNIQUE INDEX uni_name (name);
对某一列添加一个唯一约束 而不创建唯一索引;
此时name列没有索引,但仍然具有唯一性保证。
ALTER TABLE students
ADD CONSTRAINT uni_name UNIQUE (name);