目录
- 一、KEY
- 1、primary key
- 2、unique key
- 3、foreign key
- 二、index
- 三、MySQL中Index与Key的区别
- 四、MySQL中unique key和primary key有什么区别
- 五、建立索引的SQL
一、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`);