mysql索引外键

1,索引

什么是索引?

索引------搜索---引导------引导着我去搜索到某个记录的

定义:

没有索引的情况下,我们查询一条记录,需要从第一条记录一直往下查询,知道查找到我们需要的记录,如果记录数特别大的话,相当于大海捞针,速度特别慢

索引:建一个索引-----指向的是数据的位置-----反映到新华字典-----记录所在的页数

 

优势:

查询速度快了,但是不足:

增加了维护索引的工作量-----每增加一条记录----我就要在索引列表中增加一个索引号指向这条记录的位置

查询速度快了,但是增  删除  更新 速度慢了

索引的分类:

1,主键索引:当我们创建一个表后,指定主键后,自动将主键设置为主键索引

2,普通索引:就是在一个普通的字段上建立索引

3,唯一索引:数据表中的某个字段是唯一的,没有重复----

4,全文索引:在某个字段上建立全文索引,将记录内的关键字抽取出来,然后对每个关键字进行索引    sphinx-----可以建立全文索引

创建索引:

(1)create [索引类型] index 索引名 on 表名(表的某个字段上)

(2)alter table 表名 add [索引类型] index (表的字段)

(3)删除索引 drop index 索引名 on 表名


修改索引:

只能是先删除在增加

 

 

 

外键:

什么是外键:

学生举例:

每个学生对应一张

个人信息表(姓名,学号)

学生详细信息表(成绩,违纪记录,获得奖励,家庭地址,学费,)

这两个表通过外键关联之后,如果有一天你毕业了,应该将你姓名,学号删除,这个学生下面对应的详细信息(成绩,违纪记录,获得奖励,家庭地址,学费)自动删除

 

使用外键的条件:

(1)保证数据表的存储引擎必须是innoDB

(2)外键关系的两个表的列必须数据类型相似  int tinyint   int----------varchar

 

外键定义的语法:

create table tem(id int, name varchar,foreign key(id) references outTable(id) on delete cascade on update cascade )

监听的外键表的行为:delete  update 

 foreign key(id)  指定当前表哪个字段是外键

 references 和外部哪个表关联

constrict ‘’;  指定一个名称,(外键关联的名称,为了将来删除这个外键的话,通过这个名称来删除)约束的名称

 

mysql> create table xiaodi(id intprimary key auto_increment,foreign_id int,name

 varchar(32),constraint xiaodi_for foreignkey(foreign_id) references dage(id) o

n delete cascade on updatecascade)engine=innodb default charset=utf8;

 

(1)使用外键将两个表关联

在当前表创建外键字段------和外部表的某个字段可关联:foreign key(foreign_id) references dage(id)

关联起来之后监听着外部那个表,如果他删除了,我要做什么?如果他更新了,我又要做什么

on delete (参数3个)   on update  (参数3个)

 

 

删除外键:

alter table 表名 drop foreign key 外键名称


### MySQL 中主索引的概念及区别 #### 1. 主 (Primary Key) - **定义**: 主是用来唯一标识表中每一条记录的一个或一组字段。在一个表中,主的值必须是唯一的,并且不能为空。 - **特点**: - 每个表只能有一个主。 - 主通常是自增的整数型字段(使用 `AUTO_INCREMENT` 属性),以确保每次插入新数据时主值都是唯一的且递增的[^4]。 - 主是一种聚集索引,数据行的物理顺序与主的逻辑顺序一致,因此基于主的查询性能较高[^2]。 - **使用场景**: - 当需要唯一标识表中的每一行数据时,应该设置主。 - 主通常被用作其他表的,建立表与表之间的关联关系,确保数据的一致性和完整性。 #### 2. (Foreign Key) - **定义**: 用来建立两个表之间的参照完整性约束,表示当前表中的某一列或多列指向另一张表的主或唯一索引。 - **特点**: - 的作用在于维护不同表之间的数据一致性,防止非法数据的插入或删除。 - 不同于主可以重复,也可以为空。 - 在 InnoDB 存储引擎下支持,而在 MyISAM 存储引擎下不支持[^2]。 - **使用场景**: - 当两张表之间存在一对多或一对一的关系时,可以通过来实现这种关系。 - 可用于级联更新或删除操作,从而保持数据同步。 #### 3. 索引 (Index) - **定义**: 索引是对数据库表中一列或多列的值进行排序的一种结构,目的是加快查询速度。 - **类型**: - **单值索引**: 对单个列创建的索引。 - **复合索引**: 对多个列联合创建的索引。 - **主索引**: 唯一标识表中每条记录的索引,同时也是聚集索引。 - **唯一索引**: 确保某列或多列的值在整个表范围内是唯一的,但允许部分行为空值[^4]。 - **全文索引**: 用于全文检索,仅限于 MyISAM 和 InnoDB 表的部分字符串类型的列。 - **覆盖索引**: 查询所需的数据全部来自索引本身,无需访问实际的数据行,可显著提升查询效率[^3]。 - **特点**: - 索引提高了查询的速度,但也增加了写入操作的成本,因为每次插入、更新或删除数据时都需要维护索引。 - 聚簇索引决定了数据在磁盘上的物理存储顺序,而非聚簇索引则是通过指针指向实际数据的位置[^2]。 - **使用场景**: - 经常作为查询条件的列适合创建索引。 - 如果某个查询经常涉及多个列,则可以考虑创建复合索引。 - 使用覆盖索引优化频繁执行的简单查询,避免回表操作。 ```sql -- 创建带主的表 CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL UNIQUE, email VARCHAR(100), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- 添加约束 ALTER TABLE orders ADD CONSTRAINT fk_user_id FOREIGN KEY (user_id) REFERENCES users(id); -- 创建普通索引 CREATE INDEX idx_email ON users(email); -- 创建唯一索引 CREATE UNIQUE INDEX unique_username ON users(username); ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值