MySQL中key和index的区别

一、KEY

CREATE TABLE `phpcolor_ad` (
`id` mediumint(8) NOT NULL AUTO_INCREMENT,
`name` varchar(30) NOT NULL,
`type` mediumint(1) NOT NULL,
`code` text,
PRIMARY KEY (`id`),
KEY `type` (`type`)
);

最后一句的KEY type (type)是什么意思?

如果只是key的话,就是普通索引。单独的key和其他关键字结合的key(primary key)实际表示的意义是不同的。key是数据库的物理结构,它包含两层意义和作用。一是约束(偏向于约束和规范数据库的结构完整性),二是索引(辅助查询用的)。包括primary key、unique key、foreign key等。

1、primary key

primary key有两个作用,一是约束作用,用于规范一个存储主键和唯一性,但同时也在此key上建立了一个主键索引。

primary key约束:

唯一标识数据库中的每条记录
主键必须包含唯一的值
主键列不能包含null值
每个表有且只能有一个主键

2、unique key

unique key也有两个作用,一是约束作用,规范数据的唯一性 ,但同时也在这个key上建立了一个唯一索引。

unique key约束:

唯一标识数据库表中的每条记录
每个表可以有多个unique key约束
unique key主要用来防止数据插入的时候重复的

3、foreign key

foreign key也有两个作用,一是约束作用(constraint),规范数据的引用完整性,但同时也在这个key上建立了一个index。

可见mysql的key是同时具有constraint和index的意义。
代码实例:

CREATE TABLE `admin_role` (
  `adminSet_id` varchar(32) NOT NULL,
  `roleSet_id` varchar(32) NOT NULL,
  PRIMARY KEY (`adminSet_id`,`roleSet_id`),
  KEY `FK9FC63FA6DAED032` (`adminSet_id`),
  KEY `FK9FC63FA6C7B24C48` (`roleSet_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

主键、两个列组合在一起,是唯一的,内建唯一性索引,并且不能为NULL

两个KEY定义,相当于分别对这两列建立索引

key的用途主要是用来加快查询速度的

二、index

index是数据库的物理结构,它只是辅助查询的,它创建时会在另外的表空间以一个类似目录的结构存储。索引要分类的话分为前缀索引、全文本索引等。因此,索引只是索引,它不会去约束索引的字段的行为(那是key要做的事情)。

三、MySQL中Index与Key的区别

Key即键值,是关系模型理论中的一部份,比如有主键(Primary Key),外键(Foreign Key)等,用于数据完整性检否与唯一性约束等。

而Index则处于实现层面,比如可以对表的任意列建立索引,那么当建立索引的列处于SQL语句中的Where条件中时,就可以得到快速的数据定位,从而快速检索。
至于Unique Index,则只是属于Index中的一种而已,建立了Unique Index表示此列数据不可重复,猜想MySQL对Unique Index类型的索引可以做进一步特殊优化吧。

于是乎,在设计表的时候,Key只是要处于模型层面的,而当需要进行查询优化,则对相关列建立索引即可。
另外,在MySQL中,对于一个Primary Key的列,MySQL已经自动对其建立了Unique Index,无需重复再在上面建立索引了。

四、MySQL中unique key和primary key有什么区别

1、Primary key的1个或多个列必须为NOT NULL,如果列为NULL,在增加PRIMARY KEY时,列自动更改为NOT NULL。而Unique key对列没有此要求。
2、一个表只能有一个Primary key,但可以有多个Unique key
3、Unique key主要用来防止插入重复数据

五、建立索引的SQL

##1.添加PRIMARY KEY(主键索引):

ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` ) 

##2.添加UNIQUE(唯一索引) :

ALTER TABLE `table_name` ADD UNIQUE ( `column` ) 

##3.添加INDEX(普通索引) :

ALTER TABLE `table_name` ADD INDEX index_name ( `column` )
##5.添加多列索引:
ALTER TABLE `table_name` ADD INDEX index_name ( `column1`, `column2`, `column3` )

##6.删除以上索引,添加多列索引:
ALTER TABLE payment DROP INDEX idx_customer_id;
ALTER TABLE payment DROP INDEX idx_staff_id;
ALTER TABLE `payment` ADD INDEX idx_customer_id_staff_id(`customer_id`, `staff_id`);

##7.一次添加多个索引
ALTER TABLE  table_name ADD INDEX idx1 ( `aaa`), ADD INDEX idx2 ( `bbb`,`ccc`), ADD INDEX idx3( `ddd`);

参考链接:https://blog.csdn.net/ty13572053785/article/details/87004223

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值