内容
1、MySQL 的主键。
2、MySQL 的唯一约束。
3、MySQL 索引。
4、主键、唯一约束和唯一索引的区别。
1、MySQL 的主键。
“主键”的全称是“主键约束”。MySQL 主键约束是一列或列组合(其中由多列组成的主键称为复合主键),其值唯一标识表中的每一行。这样的一列或多列称为表的主键,通过它可以保证表的实体完整性。.
(1)一张表可以没有主键,最多只能有一个主键。
(2)主键值必须唯一标识表中的每一行,不能为NULL,即两行数据不可能在同一张表中具有相同的主键值。
2、MySQL 的唯一约束。
MySQL 唯一约束(Unique Key)是指所有记录中的字段值不能重复。比如给id字段加上唯一约束后,每条记录的id值都是唯一的,不能重复。如果其中一条记录的 id 值为“0001”,则表中不能有另一条 id 值为“0001”的记录。
唯一约束确保一列或多列没有重复值。
唯一约束类似于主键约束,因为它们都确保列的唯一性。不同的是,一张表中可以有多个唯一约束,设置唯一约束的列允许有空值,但最多只能有一个空值。一张表只能有一个主键约束,不允许有空值。例如,在用户信息表中,为了避免表中用户名重复,可以将用户名设置为唯一约束。
唯一约束可以在创建表时直接设置,通常在主键以外的列上。
直接在定义列末尾使用 UNIQUE 关键字指定唯一约束,语法格式为: UNIQUE 。(或 UNIQUE KEY `unique_name` (`first_name`, `last_name`) )
修改表时添加唯一约束的语法格式为:ALTER TABLE ADD CONSTRAINT UNIQUE(); .
在 MySQL 中删除唯一约束的语法如下: ALTER TABLE DROP INDEX ; .
如果业务要求两个字段在组合时是唯一的建表时候添加唯一约束,例如“地址”+“姓名”是唯一的,则需要对两个甚至多个列添加一个组合唯一约束。
3、MySQL 索引。
为什么要使用索引?
索引是 MySQL 中非常重要的数据库对象。它是数据库性能调优技术的基础,常用于实现数据的快速检索。
什么是索引?
首先,我们可以举个例子。每个人都应该使用字典。我们可以通过目录快速定位到我们要查找的内容。然后索引类似于目录。在数据库表记录中,使用索引,我们可以快速筛选和查找数据记录。.
索引是根据表中的一列或几列按一定顺序建立的列值与记录行的对应关系表。的有序列表。
例如,如果为表中的name字段建立索引,则根据表中的name字段对索引进行排序,并为其建立一个指向记录在数据表中位置的“指针”。
查询方式有两种,一种是全表扫描;另一种是使用建立在数据表上的索引进行扫描。
在 MySQL 中,访问数据库表的行数据通常有两种方式:
(1) 顺序访问
顺序访问是对表进行全表扫描,从头到尾逐行遍历,直到在无序的行数据中找到符合条件的目标数据。这种方法实现起来比较简单,但是当表中有大量数据时,效率很低。比如在千万条数据中查找少量数据时建表时候添加唯一约束,使用顺序访问方式会遍历所有数据,耗费大量时间,明显影响数据库的处理性能。
(2) 索引访问
索引访问是一种通过遍历索引直接访问表中行的方法。使用这种方法的前提是在表上建立索引。在列上创建索引后,在查找数据时,可以直接根据列上的索引找到对应记录行的位置,从而快速找到数据。索引存储了指向指定列的数据值的指针,并按照指定的排序顺序对这些指针进行排序。
比如学生基本信息表students中,如果根据student_id建立索引,系统会建立索引列到实际记录的映射表。当用户需要查找student_id为12022的数据时,系统会先在student_id上查找student_id索引。找到记录,然后通过映射表直接找到数据行,并返回该行数据。因为扫描索引的速度一般要比扫描实际数据行的速度快很多,所以使用索引可以大大提高数据库的工作效率。
该指数分为:
(1)普通索引:是最基本的索引类型,它的目的是加快对数据的访问,没有任何限制。索引列值可以取空值或重复值。使用关键字“INDEX”或“钥匙” 。
(2)唯一索引:是不允许索引值相同的索引。创建唯一索引的目的往往不是为了提高访问速度,而是避免数据重复。索引列值不能重复,即索引列值必须唯一。使用关键字“UNIQUE”创建。
(3)主键索引:是特定类型的唯一索引。索引值不能为空值。主键用于唯一标识表中的一条记录。主键不允许空值,并且主键是唯一的。只有一张表可以有一个主键,不能有多个主键。使用关键字“PRIMARY KEY”创建。
注意:唯一索引和主键索引不是互斥的;唯一索引包括主键索引;主键索引是一个特殊的唯一索引。
索引按列数划分:
(1)单列索引:即一个索引只包含单列,一张表可以有多个单列索引,但是这些单列索引不是复合索引。比如创建索引学生 ID;创建一个名称与名称单列索引。
(2) 复合索引(composite index or multi-column index):即一个索引包含多列。例如用用户ID、用户名Name、用户年龄Age创建的索引就是复合索引。此时,排序规则是左前缀原则,即先按用户ID排序;当第一列的值相同时,再按用户名第二列排序;以此类推。
索引分为:
(1)B-树索引;(2)哈希索引。
虽然索引可以加快查询速度,提高 MySQL 的处理性能,但过度使用索引也会造成以下缺点:
(1)创建和维护索引需要时间,随着数据量的增加而增加。
(2)每个索引除了数据表占用的数据空间外,还要占用一定的物理空间。如果要建立聚集索引,需要的空间会更大。
(3)在表中增删改数据时,索引也是动态维护的,降低了数据维护的速度。
注意:索引在某些情况下可以加快查询速度,但在某些情况下会降低效率。
索引只是提高效率的一个因素,因此在创建索引时应遵循以下原则:
(1)在经常搜索的列上建立索引可以加快搜索速度。
(2)在作为主键的列上创建索引,强制列的唯一性,并组织表中数据的排列。
(3)在表连接中经常用到的列上创建索引,这些列主要是一些外键,可以加快表连接的速度。
(4)在经常需要按范围搜索的列上创建索引,因为索引已经排序,所以它指定的范围是连续的。
(5)在经常需要排序的列上创建索引,因为索引已经排序了,所以可以在查询中使用索引的排序来加快排序查询。
(6)在经常使用WHERE子句的列上创建索引,加快条件的判断。
相应地,在某些应用中,创建索引并不能提高MySQL的工作效率,甚至会在一定程度上带来负面影响,降低数据库的工作效率。一般来说,不适合创建索引的环境如下:
(1) 查询中很少使用或引用的列不应该创建索引。因为这些列很少使用,索引或不索引并不会提高查询速度。相反,由于增加了索引,相反,它会减慢系统维护并增加空间需求。
(2) 不应该为那些数据值很少的列创建索引。因为这些列的值很少,比如personal表的gender列。查询结果集的数据行占了大部分表中的数据行。在很大的比例下,增加索引并不会显着加快检索速度。
(3)不应为定义为 TEXT、IMAGE 和 BIT 数据类型的列创建索引。因为这些列要么非常大,要么具有很少的值。
(4)当修改性能远大于检索性能时,不应该创建索引。因为修改性能和检索性能是矛盾的。创建索引时,会提高检索性能,减少修改性能。降低索引时,会提高修改性能,降低检索性能。因此,当修改性能远大于检索性能时,不应该创建索引。
4、主键、唯一约束和唯一索引的区别。
主键和唯一索引的区别是:
(1) 主键必须是唯一索引,唯一索引不一定是主键。
(2) 一张表可以有多个唯一索引,但最多有一个主键。
(3)主键的列值不允许空值,而唯一索引的列值最多有一个空值。
例如,主键相当于一本书的页码,索引相当于这本书的目录。
在创建或设置主键时,MySql 会自动添加与主键对应的唯一索引,因此无需额外添加使用主键作为唯一索引的语句。数据库管理系统自动为主键生成唯一索引,所以主键是特殊索引。您可以通过 SQL 语句(“SHOW INDEX FROM tablename;”或“SHOW KEYS FROM tablename;”)查看创建的表的索引。
# SQL创建语句示例。
CREATE TABLE `ik_admin`
(
`user_id` bigint NOT NULL AUTO_INCREMENT COMMENT '用户ID',
`user_name` varchar(50) NOT NULL,
`password` varchar(128) NOT NULL,
`role_id` bigint NOT NULL,
`last_ip` varchar(20) NOT NULL DEFAULT '',
`last_time` datetime NULL,
`email` varchar(32) NOT NULL DEFAULT '',
`status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态(0-禁用 1-启用)',
PRIMARY KEY (`user_id`), # 主键:默认自动生成索引, 列值不能重复 而且不允许为空值。
UNIQUE INDEX `userName` (`user_name`) # 唯一索引:列不能重复 但可以有空值(最多只有一个空值)。
) ENGINE = MyISAM AUTO_INCREMENT = 1001 DEFAULT CHARSET = utf8 COMMENT ='管理员表';
唯一约束和唯一索引的区别:
(1)唯一约束和唯一索引都可以实现列数据的唯一性,列值可以有空值。
(2)创建唯一约束时,会自动创建同名唯一索引,不能单独删除索引,删除约束会自动删除索引。唯一约束就是实现唯一性通过唯一索引获取数据。
(3)创建唯一索引,这个索引是独立的,可以单独删除。
(4)如果你想对一个列有约束和索引,这两者可以分开删除。你可以先建一个唯一索引,然后再建一个同名的唯一约束。
(5)如果一个表的一个字段要作为另一个表的外键,那么这个字段必须有唯一约束(或主键)。如果只有唯一索引,会报错被报告。
索引的键不必与唯一约束完全匹配,唯一约束只能使用索引的前导列。请参见下面的示例:
创建表 t(n1 编号,n2 编号);
在 t(n1, n2) 上创建索引 t_idx;
上面只创建了两列的复合索引,不需要唯一索引。
更改表 t 添加约束 t_uk 唯一(n1) 使用索引 t_idx;
您可以使用此索引创建唯一约束,并且它仅在第一列上是唯一的,这意味着唯一约束比索引更具限制性。
那么这个索引的第二列有什么意义呢?有时,使用一些冗余列,您可以直接从索引中获取所有 SELECT 数据,而无需返回表。