主键、自增主键、主键索引、唯一索引概念区别与性能区别

概念区别:

主键:指字段唯一不为空值的列。

主键索引:指的就是主键,主键没有明确的概念定义,主键既是约束,也是索引,主键是索引的一种,是唯一索引的特殊类型。创建主键的时候,数据库默认会为主键创建一个唯一索引。

自增主键:字段类型为数字、自增、并且是主键。

唯一索引:索引列的值必须唯一,但允许有空值。主键是唯一索引,这样说没错。但反火来说唯一索引也是主键就错误了,因为唯一索引允许空值,主键不允许有空值,所以不能说唯一索引也是主键。

性能区别:

通过测试,发现主键、自增主键、唯一索引的查询效率不一样,当然这个差距很小,总结为:

查询:唯一索引 > 自增主键 > 主键(主键索引)

插入:主键 > 自增主键 > 唯一索引

测试场景:

创建3个表,名字段相同:id,name,money,tradDate
各插入100W条相同的数据

table A:id为主键,table B:id自增并且是主键,tableC:id创建唯一索引

查询:

性能:唯一索引 >自增主键> 主键(主键索引)

A表(主键):0.06s

B表(自增主键):0.01s,

C表(唯一索引):0.00s

插入:

10W条数据,批量插入,性能:主键 >自增主键 > 唯一索引 

A表(主键):38.408s

B表(自增主键):38.708s,

C表(唯一索引):39.018s


写了这么多,忽然感觉做这个测试没有什么意义,有木有?


主键索引唯一索引的主要区别在于: 1. **唯一性**: - **主键索引**:一个表仅能有一个主键,其值必须唯一且不可为NULL。这是为了保证每一行数据的唯一标识。 - **唯一索引**:可以有多个,对索引列的要求稍低,允许NULL值,但在该列上有唯一约束。 2. **数量限制**: - **主键**:一个表只允许有一个主键。 - **唯一索引**:可以在多列或多行上创建,不受此限制。 3. **自动增长**: - **主键**:如果指定为主键并且设置了自动增长属性,数据库会自动为其分配连续的数值。 - **唯一索引**:不支持自动增长功能。 4. **索引类型**: - **主键索引**:通常是**聚簇索引**,数据存储基于主键值。 - **唯一索引**:通常是**非聚簇索引**,数据仍然按照行的物理顺序存储,但索引本身是独立的。 5. **外键关联**: - **主键**:因为是唯一标识,其他表通过外键经常引用主键。 - **唯一索引**:虽然也能用于外键参照,但不如主键频繁。 6. **使用场景**: - **主键**:适用于作为行的唯一标识,常用于关系数据库的一对一或多对多关系中。 - **唯一索引**:适合那些只需要保证某个字段或一组字段值的独特性的场景,比如邮箱地址、电话号码等。 在实际操作中,你可以使用SQL语句来创建这些索引,例如: ```sql CREATE TABLE example ( id INT PRIMARY KEY AUTO_INCREMENT, email VARCHAR(255) UNIQUE ); ``` 这里`id`是主键,`email`是唯一索引
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值