唯一索引与主键索引的比较

合集下载

数据库的几个概念:主键,外键,索引,唯一索引

数据库的几个概念:主键,外键,索引,唯一索引

数据库的几个概念:主键,外键,索引,唯一索引主键:主键是数据表的唯一索引,比如学生表里有学号和姓名,姓名可能有重名的,但学号确是唯一的,你要从学生表中搜索一条纪录如查找一个人,就只能根据学号去查找,这才能找出唯一的一个,这就是主键;如:id int(10) not null primary key auto_increment ;自增长的类型;外键:定义数据表假如某个电脑生产商,它的数据库中保存着整机和配件的产品信息。

用来保存整机产品信息的表叫做 Pc;用来保存配件供货信息的表叫做Parts。

在Pc表中有一个字段,用来描述这款电脑所使用的CPU型号;在Parts 表中相应有一个字段,描述的正是CPU的型号,我们可以把它想成是全部CPU的型号列表。

很显然,这个厂家生产的电脑,其使用的CPU一定是供货信息表(parts)中存在的型号。

这时,两个表中就存在一种约束关系(constraint)——Pc表中的CPU型号受到Parts 表中型号的约束。

首先我们来创建 parts 表:CREATE TABLE parts (... 字段定义 ...,model VARCHAR(20) NOT NULL,... 字段定义 ...);接下来是Pc表:CREATE TABLE pc (... 字段定义 ...,cpumodel VARCHAR(20) NOT NULL,... 字段定义 ...};设置索引若要设置外键,在参照表(referencing table,即Pc表) 和被参照表(referenced table,即parts表) 中,相对应的两个字段必须都设置索引(index)。

对Parts表:ALTER TABLE parts ADD INDEX idx_model (model);这句话的意思是,为 parts 表增加一个索引,索引建立在 model 字段上,给这个索引起个名字叫idx_model。

对Pc表也类似:ALTER TABLE pc ADD INDEX idx_cpumodel (cpumodel);事实上这两个索引可以在创建表的时候就设置。

主键索引和唯一索引

主键索引和唯一索引
-- 区别
主键是一种约束,唯一索引是一种索引,两者在本质上是不同的。
主键创建后一定包含一个唯一性索引,唯一性索引并不一定就是主键。
唯一性索引列允许空值,而主键列+ 唯一索引了。
主键可以被其他表引用为外键,而唯一索引不能。
一个表最多只能创建一个主键,但可以创建多个唯一索引。
主键更适合那些不容易更改的唯一标识,如自动递增列、身份证号等。
在 RBO 模式下,主键的执行计划优先级要高于唯一索引。 两者可以提高查询的速度。

四种常见的索引类型

四种常见的索引类型

四种常见的索引类型主键索引:数据记录⾥⾯不能有 null,数据内容不能重复,在⼀张表⾥⾯不能有多个主键索引。

普通索引:使⽤字段关键字建⽴的索引,主要是提⾼查询速度唯⼀索引:字段数据是唯⼀的,数据内容⾥⾯能否为 null,在⼀张表⾥⾯,是可以添加多个唯⼀索引。

全⽂索引:在⽐较⽼的版本中,只有 myisam 引擎⽀持全⽂索引,在 innodb5.6后引擎也⽀持全⽂索引,在 mysql 中全⽂索引不⽀持中⽂。

我们⼀般使⽤ sphinx 集合coreseek 来实现中⽂的全⽂索引。

什么是索引?Mysql⽬前主要的⼏种索引类型⼀、索引MySQL索引的建⽴对于MySQL的⾼效运⾏是很重要的,索引可以⼤⼤提⾼MySQL的检索速度。

打个⽐⽅,如果合理的设计且使⽤索引的MySQL是⼀辆兰博基尼的话,那么没有设计和使⽤索引的MySQL就是⼀个⼈⼒三轮车。

索引分单列索引和组合索引。

单列索引,即⼀个索引只包含单个列,⼀个表可以有多个单列索引,但这不是组合索引。

组合索引,即⼀个索引包含多个列。

创建索引时,你需要确保该索引是应⽤在 SQL 查询语句的条件(⼀般作为 WHERE ⼦句的条件)。

实际上,索引也是⼀张表,该表保存了主键与索引字段,并指向实体表的记录。

上⾯都在说使⽤索引的好处,但过多的使⽤索引将会造成滥⽤。

因此索引也会有它的缺点:虽然索引⼤⼤提⾼了查询速度,同时却会降低更新表的速度,如对表进⾏INSERT、UPDATE和DELETE。

因为更新表时,MySQL不仅要保存数据,还要保存⼀下索引⽂件。

建⽴索引会占⽤磁盘空间的索引⽂件。

⼆、索引类型Mysql⽬前主要有以下⼏种索引类型:FULLTEXT,HASH,BTREE,RTREE。

1. FULLTEXT即为全⽂索引,⽬前只有MyISAM引擎⽀持。

其可以在CREATE TABLE ,ALTER TABLE ,CREATE INDEX 使⽤,不过⽬前只有CHAR、VARCHAR ,TEXT 列上可以创建全⽂索引。

主键、索引等的区别

主键、索引等的区别

键、索引、约束及其区别今天下午刚好没事,把一些基础性的概念理顺一下,存档,省的麻烦,嘿嘿一.索引1.什么是索引?索引是对数据库表中一列或多列的值进行排序的一种结构。

在关系型数据库中,索引是一种与表有关的数据库结构,是事实存在的。

它可以使对于表的select等等操作更加快速,相当于一本书的目录。

对于一张表,如果我们想要找到某一列符合特定值的记录,第一种方法是全表搜索,匹配,然后把所有符合的记录列出,但是这样做会消耗大量数据库系统时间,并造成大量磁盘I/O操作;第二种就是在表中建立索引,然后在索引中找到符合查询条件的索引值,最后通过保存在索引中的ROWID(相当于页码)快速找到表中对应的记录。

索引是一个单独的、物理的数据库结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。

由此可知,索引是要消耗数据库空间的。

并非所有的数据库都以相同的方式使用索引。

作为通用规则,只有当经常查询索引列中的数据时,才需要在表上创建索引。

索引占用磁盘空间,并且降低添加、删除和更新行的速度。

在多数情况下,索引用于数据检索的速度优势大大超过它的不足之处。

但是,如果应用程序非常频繁地更新数据或磁盘空间有限,则可能需要限制索引的数量。

可以使用单列作为索引,也可以使用多列联合作为索引。

2.索引的优缺点优点:(1)大大加快数据的检索速度;(2)创建唯一性索引,保证数据库表中每一行数据的唯一性;(3)加速表和表之间的连接;(4)在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间。

缺点:(1)索引需要占物理空间。

(2)当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度。

建立索引时的注意事项:(1)考虑已在表上创建的索引数量。

最好避免在单个表上有很多索引(2)检查已在表上创建的索引的定义。

最好避免包含共享列的重叠索引(3)检查某列中唯一数据值的数量,并将该数量与表中的行数进行比较。

数据库MySQL常见面试问题

数据库MySQL常见面试问题

数据库MySQL常见⾯试问题数据库MySQL常见⾯试问题1.MySQL 主键与索引的联系与区别主键是为了标识数据库记录唯⼀性,不允许记录重复,且键值不能为空,主键也是⼀个特殊索引。

数据表中只允许有⼀个主键,但是可以有多个索引。

使⽤主键会数据库会⾃动创建主索引,也可以在⾮主键上创建索引,⽅便查询效率。

索引可以提⾼查询速度,它就相当于字典的⽬录,可以通过它很快查询到想要的结果,⽽不需要进⾏全表扫描。

主键索引外索引的值可以为空。

主键也可以由多个字段组成,组成复合主键,同时主键肯定也是唯⼀索引。

唯⼀索引则表⽰该索引值唯⼀,可以由⼀个或⼏个字段组成,⼀个表可以有多个唯⼀索引。

2.数据库索引是怎么回事?⽤的啥数据结构为什么B+树⽐B树更合适⼀个索引是存储的表中⼀个特定列的值数据结构(最常见的是B-Tree)。

索引是在表的列上创建。

所以,要记住的关键点是索引包含⼀个表中列的值,并且这些值存储在⼀个数据结构中。

请记住记住这⼀点:索引是⼀种数据结构。

什么样的数据结构可以作为索引?B-Tree 是最常⽤的⽤于索引的数据结构。

因为它们是时间复杂度低,查找、删除、插⼊操作都可以可以在对数时间内完成。

另外⼀个重要原因存储在B-Tree中的数据是有序的。

数据库管理系统(RDBMS)通常决定索引应该⽤哪些数据结构。

但是,在某些情况下,你在创建索引时可以指定索引要使⽤的数据结构。

当我们利⽤索引查询的时候,不可能把整个索引全部加载到内存,只能逐⼀加载每个磁盘页,磁盘页对应索引树的节点。

那么Mysql衡量查询效率的标准就是磁盘IO次数。

如果我们利⽤作为索引结构,那么磁盘的IO次数和索引树的⾼度是相关的。

那么为了提⾼查询效率,就需要减少磁盘IO数。

为了减少磁盘IO的次数,就需要尽量降低树的⾼度,需要把原来“瘦⾼”的树结构变的“矮胖”,树的每层的分叉越多越好,因此B树正好符合我们的要求,这也是B-树的特征之⼀。

B树 B树的节点为关键字和相应的数据(索引等)B+树 B+树是B树的⼀个变形,⾮叶⼦节点只保存索引,不保存实际的数据,数据都保存在叶⼦节点中,B+树的叶⼦节点为,放数据,⾮叶⼦节点是索引。

主键与索引的区别

主键与索引的区别

mysql中,主键与普通索引的区别是什么?一、什么是索引?索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存。

如果没有索引,执行查询时MySQL必须从第一个记录开始扫描整个表的所有记录,直至找到符合要求的记录。

表里面的记录数量越多,这个操作的代价就越高。

如果作为搜索条件的列上已经创建了索引,MySQL无需扫描任何记录即可迅速得到目标记录所在的位置。

如果表有1000个记录,通过索引查找记录至少要比顺序扫描记录快100倍。

假设我们创建了一个名为people的表:CREATE TABLE people ( peopleid SMALLINT NOT NULL, name CHAR(50) NOT NULL );然后,我们完全随机把1000个不同name值插入到people表。

下图显示了people表所在数据文件的一小部分:可以看到,在数据文件中name列没有任何明确的次序。

如果我们创建了name列的索引,MySQL将在索引中排序name列:对于索引中的每一项,MySQL在内部为它保存一个数据文件中实际记录所在位置的“指针”。

因此,如果我们要查找name等于“Mike”记录的peopleid(SQL命令为“SELECT peopleid FROM people WHEREname='Mike';”),MySQL能够在name的索引中查找“Mike”值,然后直接转到数据文件中相应的行,准确地返回该行的peopleid(999)。

在这个过程中,MySQL只需处理一个行就可以返回结果。

如果没有“name”列的索引,MySQL要扫描数据文件中的所有记录,即1000个记录!显然,需要MySQL处理的记录数量越少,则它完成任务的速度就越快。

二、索引的类型MySQL提供多种索引类型供选择:普通索引这是最基本的索引类型,而且它没有唯一性之类的限制。

普通索引可以通过以下几种方式创建:创建索引,例如CREATE INDEX <索引的名字> ON tablename (列的列表);修改表,例如ALTER TABLE tablename ADD INDEX [索引的名字] (列的列表);创建表的时候指定索引,例如CREATE TABLE tablename ( [...], INDEX [索引的名字] (列的列表) );唯一性索引这种索引和前面的“普通索引”基本相同,但有一个区别:索引列的所有值都只能出现一次,即必须唯一。

唯一性索引(Unique Index)与普通索引(Normal Index)差异(上)

唯一性索引(Unique Index)与普通索引(Normal Index)差异(上)
1 rows processed
SQL> select * from t where data_object_id=1000;
执行计划
----------------------------------------------------------
Plan hash value: 335537167
3、违反约束实验
作为唯一性索引,在添加创建和进行dml操作的时候,都会严格发挥出约束的作用。
SQL> insert into t select * from t where rownum<2;
insert into t select * from t where rownum<2
----------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
SQL> select segment_name, segment_type, bytes, blocks, extents from dba_segments where segment_name in ('IDX_T_NORMALID','IDX_T_UNIID');
SEGMENT_NAME SEGMENT_TYPE BYTES BLOCKS EXTENTS
Index created
//唯一性索引
SQL> create unique index idx_t_uniid on t(data_object_id);

MySQL主键和唯一索引的选择原则

MySQL主键和唯一索引的选择原则

MySQL主键和唯一索引的选择原则MySQL主键和唯一索引是数据库设计中非常重要的概念。

它们在保证数据完整性、提高查询效率等方面起着重要的作用。

但在实际应用中,我们如何选择应该使用主键还是唯一索引呢?本文将从理论和实践两方面探讨这个问题。

一、MySQL主键和唯一索引的基本概念和作用MySQL主键是用于唯一标识一条记录的字段或多个字段的组合,它在表中具有唯一性和非空性的特征。

主键的作用主要有两个方面:一是保证数据的完整性,二是提高查询效率。

在数据库中,主键是通过B+树来实现的,这使得在进行查询和排序操作时,可以快速地定位到所需的数据。

唯一索引是指对某个字段或多个字段的组合进行索引,使得在添加或修改数据时,这些字段的取值是唯一的。

唯一索引的作用主要是保证数据的唯一性。

在数据库中,唯一索引和主键一样,也是通过B+树来实现的。

从概念上来说,主键和唯一索引都能保证数据的唯一性。

那么它们之间到底有何区别呢?区别主要体现在如下几个方面:1. 主键必须是非空的,而唯一索引可以为空;2. 一个表只能有一个主键,而可以有多个唯一索引;3. 主键字段的类型可以是任意的,而唯一索引字段的类型有一定的限制;4. 主键在创建表的时候会自动创建,而唯一索引需要手动创建。

二、选择原则:根据字段的特性和业务需求决定在实际应用中,选择使用主键还是唯一索引,应该根据字段的特性和业务需求来决定。

下面是一些选择的原则供参考:1. 唯一标识字段应该选择主键索引。

对于那些能够唯一标识一条记录的字段,比如ID字段,我们应该将其设置为主键。

这样可以保证数据的唯一性,同时还可以利用主键索引的快速查询和排序功能。

2. 需要对字段进行排序或者分组的,应该选择主键索引。

主键索引是通过B+树来实现的,它可以使得查询结果按照主键的顺序进行排序输出。

当我们需要对查询结果进行排序或者分组时,使用主键索引可以提高查询效率。

3. 需要将字段与其他表进行关联的,应该选择主键索引。

MySQL数据库设计中的主键和唯一键使用

MySQL数据库设计中的主键和唯一键使用

MySQL数据库设计中的主键和唯一键使用在数据库设计中,主键(Primary Key)和唯一键(Unique Key)是非常重要的概念,它们的正确使用和合理设计对于数据库的性能和数据的完整性都起着至关重要的作用。

本文将针对MySQL数据库中的主键和唯一键进行深入的讨论和分析。

一、主键的定义和作用主键是用来唯一标识一条记录的字段或字段组合,它具有以下特点和作用:1. 唯一性:主键的值在整个表中必须是唯一的,每个记录必须具有唯一的主键值,否则会违反主键的定义。

2. 非空性:主键的值不能为空,因为为空的记录无法唯一标识。

3. 确定性:通过主键可以确定一条记录,即通过主键值可以唯一地定位一条记录。

4. 数据索引:主键字段会默认创建索引,加速数据检索和查询的效率。

在MySQL数据库中,常见的主键类型有:1. 单字段主键:以表中的某个字段作为主键,例如用户表中的id字段。

2. 复合主键:以多个字段的组合作为主键,例如订单表中的orderId和userId 字段的组合。

3. 自增主键:自动增长的主键值,通常用于单字段主键的设计,例如id字段。

二、主键的设计原则和注意事项在设计和选择主键时,需要遵循以下原则和注意事项:1. 简洁性:主键应该尽可能简洁、明确,不要选择过长或者复杂的字段作为主键,以免增加数据库的负担和降低查询性能。

2. 不可变性:主键的值在记录创建后应该是不可变的,不应该频繁修改主键的值,否则容易引发数据库冲突和数据一致性问题。

3. 避免业务含义:主键并不一定要有业务含义,最好不要使用带有业务含义的字段作为主键,尽量使用无意义的自增主键或者全局唯一标识符(GUID)。

4. 合理选择主键类型:根据需要选择适当的主键类型,如果需要保证全局唯一性,可以选择GUID作为主键类型,如果只是保证表内唯一性,可以选择自增主键或者复合主键。

5. 性能考虑:主键字段会默认创建索引,在设计主键时要考虑索引对查询性能的影响,尽量选择较小的数据类型来减少索引的大小和提高查询效率。

MySQL中KEY、PRIMARYKEY、UNIQUEKEY、INDEX的区别

MySQL中KEY、PRIMARYKEY、UNIQUEKEY、INDEX的区别

MySQL中KEY、PRIMARYKEY、UNIQUEKEY、INDEX的区别对于题⽬中提出的问题,可以拆分来⼀步步解决。

在 MySQL 中 KEY 和 INDEX 是同义。

那这个问题就可以简化为 PRIMARY KEY,UNIQUE KEY 和 INDEX 的区别。

⽽这三者也正好是索引的划分,主键索引,唯⼀索引和普通索引(INDEX)。

使⽤ INDEX 来加速从数据库中读取数据。

INDEX 通常加在那些 JOIN, WHERE,和 ORDER BY ⼦句的列上。

创建索引时,需要确保该索引是应⽤在 SQL 查询语句的条件(⼀般作为 WHERE ⼦句的条件)。

实际上,索引也是⼀张表,该表保存了主键与索引字段,并指向实体表的记录。

索引也有它的缺点:虽然索引提⾼了查询速度,却会降低更新表的速度,如对表进⾏INSERT、UPDATE和DELETE。

因为更新表时,MySQL不仅要保存数据,还要保存⼀下索引⽂件。

MySQL 中 KEY 与 INDEX 区别KEY 通常是 INDEX 同义词。

如果关键字属性 PRIMARY KEY 在列定义中已给定,则 PRIMARY KEY 也可以只指定为KEY。

这么做的⽬的是与其它数据库系统兼容。

PRIMARY KEY 是⼀个唯⼀ KEY,此时,所有的关键字列必须定义为NOT NULL。

如果这些列没有被明确地定义为NOT NULL,MySQL应隐含地定义这些列。

KEY 即键值,是关系模型理论中的⼀部份,⽐如有主键(PRIMARY KEY),外键(Foreign KEY)等,⽤于数据完整性检否与唯⼀性约束等。

⽽ INDEX 则处于实现层⾯,⽐如可以对表个的任意列建⽴索引,那么当建⽴索引的列处于SQL语句中的Where条件中时,就可以得到快速的数据定位,从⽽快速检索。

⾄于UNIQUE INDEX,则只是属于INDEX中的⼀种⽽已,建⽴了UNIQUE INDEX表⽰此列数据不可重复,猜想MySQL对UNIQUE INDEX类型的索引可以做进⼀步特殊优化吧。

mysql中key、primarykey、uniquekey与index区别

mysql中key、primarykey、uniquekey与index区别

mysql中key、primarykey、uniquekey与index区别mysql中索引是⾮常重要的知识点,相⽐其他的知识点,索引更难掌握,并且mysql中的索引种类也有很多,⽐如primary key 、unique key 与index等等,本⽂章向⼤家介绍mysql中key 、primary key 、unique key 与index区别。

⼀、key与primary key区别CREATE TABLE wh_logrecord (logrecord_id int(11) NOT NULL auto_increment,user_name varchar(100) default NULL,operation_time datetime default NULL,logrecord_operation varchar(100) default NULL,PRIMARY KEY (logrecord_id),KEY wh_logrecord_user_name (user_name))解析:KEY wh_logrecord_user_name (user_name)本表的user_name字段与wh_logrecord_user_name表user_name字段建⽴外键括号外是建⽴外键的对应表,括号内是对应字段类似还有 KEY user(userid)当然,key未必都是外键总结:Key是索引约束,对表中字段进⾏约束索引的,都是通过primary foreign unique等创建的。

常见有foreign key,外键关联⽤的。

KEY forum (status,type,displayorder) # 是多列索引(键) KEY tid (tid) # 是单列索引(键)。

如建表时: KEY forum (status,type,displayorder)select * from table group by status,type,displayorder 是否就⾃动⽤上了此索引,⽽当 select * from table group by status 此索引有⽤吗?key的⽤途:主要是⽤来加快查询速度的。

主键、唯一键与唯一索引的区别

主键、唯一键与唯一索引的区别

主键、唯⼀键与唯⼀索引的区别⼀般,我们看到术语“索引”和“键”交换使⽤,但实际上这两个是不同的。

索引是存储在数据库中的⼀个物理结构,键纯粹是⼀个逻辑概念。

键代表创建来实施业务规则的完整性约束。

索引和键的混淆通常是由于数据库使⽤索引来实施完整性约束。

接下来我们看看数据库中的主键约束、唯⼀键约束和唯⼀索引的区别。

SQL> select * from v$version;BANNER--------------------------------------------------------------------------------Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - ProductionPL/SQL Release 11.2.0.1.0 - ProductionCORE 11.2.0.1.0 ProductionTNS for Linux: Version 11.2.0.1.0 - ProductionNLSRTL Version 11.2.0.1.0 - ProductionSQL> create table test (2 id int,3 name varchar2(20),4 constraint pk_test primary key(id))5 tablespace users;Table created.SQL> select constraint_name, constraint_type from user_constraints;CONSTRAINT_NAME C------------------------------ -PK_TEST P在test表中,我们指定了ID列作为主键,Oracle数据库会⾃动创建⼀个同名的唯⼀索引:SQL> select index_name, index_type, uniqueness, tablespace_name2 from user_indexes3 where table_owner='SCOTT'4 and table_name = 'TEST';INDEX_NAME INDEX_TYPE UNIQUENES TABLESPACE_NAME-------------------- -------------------- --------- ------------------------------PK_TEST NORMAL UNIQUE USERS此时,如果我们再试图在ID列上创建⼀个唯⼀索引,Oracle会报错,因为该列上已经存在⼀个唯⼀索引:SQL> create unique index idx_test_uk on test(id);create unique index idx_test_uk on test(id)*ERROR at line 1:ORA-01408: such column list already indexed即使创建⾮唯⼀索引也不⾏:SQL> create index idx_test_id on test(id);create index idx_test_id on test(id)*ERROR at line 1:ORA-01408: such column list already indexed那么唯⼀键约束的情况是怎样的呢?SQL> drop table test purge;Table dropped.SQL> create table test(2 id int,3 name varchar2(20),4 constraint uk_test unique(id));Table created.SQL> select constraint_name, constraint_type from user_constraints;CONSTRAINT_NAME C------------------------------ -UK_TEST U查看此时的索引情况:SQL> select index_name, index_type, uniqueness, tablespace_name2 from user_indexes3 where table_owner='SCOTT'4 and table_name = 'TEST';INDEX_NAME INDEX_TYPE UNIQUENES TABLESPACE_NAME-------------------- -------------------- --------- ------------------------------UK_TEST NORMAL UNIQUE USERSOracle同样⾃动创建了⼀个同名的唯⼀索引,⽽且也不允许再在此列上创建唯⼀索引或⾮唯⼀索引。

Mysql中普通索引key、主键索引(primarykey)、唯一索引(uniquekey。。。

Mysql中普通索引key、主键索引(primarykey)、唯一索引(uniquekey。。。

Mysql中普通索引key、主键索引(primarykey)、唯⼀索引(uniquekey。

⼀、索引的定义和由来:索引被⽤来快速找出在⼀个列上⽤⼀特定值的⾏。

没有索引,MySQL不得不⾸先以第⼀条记录开始并然后读完整个表直到它找出相关的⾏。

表越⼤,花费时间越多。

如果表对于查询的列有⼀个索引,MySQL能快速到达⼀个位置去搜寻到数据⽂件的中间,没有必要考虑所有数据。

所有的MySQL索引(PRIMARY、UNIQUE和INDEX)在B-tree树中存储。

字符串是⾃动地压缩前缀和结尾空间⼆、索引的分类1、普通索引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的话,就是普通索引。

mysql的key和index多少有点令⼈迷惑,单独的key和其它关键词结合的key(primary key)实际表⽰的意义是不同,这实际上考察对数据库体系结构的了解的。

key 是数据库的物理结构,它包含两层意义和作⽤,⼀是约束(偏重于约束和规范数据库的结构完整性),⼆是索引(辅助查询⽤的)。

包括primary key, unique key, foreign key 等。

2、主键索引primary keyprimary key 有两个作⽤,⼀是约束作⽤(constraint),⽤来规范⼀个存储主键和唯⼀性,但同时也在此key上建⽴了⼀个主键索引;PRIMARY KEY 约束:唯⼀标识数据库表中的每条记录;主键必须包含唯⼀的值;主键列不能包含 NULL 值;每个表都应该有⼀个主键,并且每个表只能有⼀个主键。

SQL有三个类型的索引,唯一索引不能有重复,但聚集索引,非聚集索引可以有重复

SQL有三个类型的索引,唯一索引不能有重复,但聚集索引,非聚集索引可以有重复

SQL有三个类型的索引,唯⼀索引不能有重复,但聚集索引,⾮聚集索引可以有重复重要:(1) SQL如果创建时候,不指定类型那么默认是⾮聚集索引(2) 聚集索引和⾮聚集索引都可以有重复记录,唯⼀索引不能有重复记录。

(3) 主键默认是加了唯⼀约束的聚集索引,但是也可以在主键创建时,指定为唯⼀约束的⾮聚集索引,因此主键仅仅是默认加了唯⼀约束的聚集索引,不能说主键就是加了唯⼀约束的聚集索引有点拗⼝,可以参考我的博客:为列创建索引实际上就是为列进⾏排序,以⽅便查询.建⽴⼀个列的索引,就相当与建⽴⼀个列的排序。

主键是唯⼀的,所以创建了⼀个主键的同时,也就这个字段创建了⼀个唯⼀的索引,唯⼀索引实际上就是要求指定的列中所有的数据必须不同。

主键⼀唯⼀索引的区别:1 ⼀个表的主键只能有⼀个,⽽唯⼀索引可以建多个。

2 主键可以作为其它表的外键。

3 主键不可为null,唯⼀索引可以为null。

聚集索引:将表内的数据按照⼀定的规则进⾏排列的⽬录。

正因为如此,⼀个表中的聚焦索引只有⼀个。

对此我们要注意“主键就是聚焦索引”这是极端错误的,是对聚焦索引的⼀种浪费。

(虽然SQLServer默认主键就是聚焦索引)使⽤聚焦索引的最⼤好处就是按照查询要求,迅速缩⼩查询范围,避免进⾏全表扫描。

其次让每个数⽬都不相同的字段作为聚焦索引也不符合“⼤数⽬不同情况下不应建⽴聚集索引的原则”。

⼀、索引的作⽤1、帮助检索数据;2、提⾼联接效率;3、节省ORDER BY、GROUP BY的时间;4、保证数据唯⼀性(仅限于唯⼀索引)。

⼆、索引的设计在确定要建⽴⼀个索引时,⾸先我们要确定它是聚集还是⾮聚集、单列还是多列、唯⼀还是⾮唯⼀、列是升序还是降序、它的存储是如何的,⽐如:分区、填充因⼦等。

下⾯逐条来看:1、聚集索引(1)⾸先指出⼀个误区,主键并不⼀定是聚集索引,只是在SQL SERVER中,未明确指出的情况下,默认将主键定义为聚集,⽽中则默认是⾮聚集,因为SQL SERVER中的ROWID未开放使⽤。

【INDEX】Oracle中主键、唯一约束与唯一索引之区别

【INDEX】Oracle中主键、唯一约束与唯一索引之区别

Oracle中主键、唯一约束与唯一索引之区别
一、概述
一般在Oracle数据表中,我们都会看到主键,索引,也会看到唯一索引、唯一约束,那么他们有什么区别呢,下面通过一个小实验简单了解一下。

二、实验过程:
首先创建一个表,并完成主键、唯一约束、唯一索引的创建,如下所示:
向表TEST中插入数据,测试
有以上信息,我们可以看出主键列的值不允许为NULL,也不允许出现重复值,唯一约束、唯一索引列的值允许为NULL,但不允许出现重复值。

查看字典表中约束的情况
查看字典表中索引的情况
通过上边我们可以看出,创建主键、唯一约束时,会同时创建与约束一致名字的索引。

下面我们删除唯一约束,查看效果
通过上面结果我们可以得知,手动创建索引后再创建约束,删除约束,不会删除索引,创建约束自动创建的索引会在约束失效或删除后自动删除。

三、总结
通过以上实验我们可以知道
1、主键约束要求列值非空,而唯一键约束和唯一索引不要求列值非空,都不能有重复数据。

2、主键约束和唯一键约束会隐式创建同名的唯一索引,当主键约束或者唯一键约束失效时,隐式创建的唯一索引会被删除。

3、相同字段序列不允许重复创建索引。

主键与唯一键的区别

主键与唯一键的区别

主键与唯⼀键的区别
sql 的三⼤类型分别是:数值类型,整形类型,字符串类型
字符串类型的char 和varchar 的区别:
在定义的时候都要指向char(M)varchar(M)的长度,varchar只是表⽰⼀定的范围,
1, varchar对存储空间的使⽤更加灵活
2, char的效率更⾼
3,如果存储的字符串的长度是已知固定的,就⽤char,如果是可变的,就⽤varchar
案例代码:
primary key 主键 unique key 唯⼀键的区别和⽤法
设置主键有两种⽅法:
1.在定义⼀个字段的时候直接在后⾯进⾏设置
2.在定义完字段后再定义。

unique唯⼀键的定义跟主键的定义都差不多,都是在后⾯定义,如果是设置多个唯⼀键的话可以在字段后⾯⽤逗号隔开。

另外,唯⼀键和主键的⼀个区别是:唯⼀键允许为空,但是主键不能为空!
主要的关键字有auto increment⾃增 comment 对⾏进⾏注释,(这⾥的注释在数据库⾥可以看到)。

MySQL中的主键和唯一索引的使用方法

MySQL中的主键和唯一索引的使用方法

MySQL中的主键和唯一索引的使用方法MySQL是一种常用的关系型数据库管理系统,其使用方法涉及许多方面,包括数据表的设计、索引的创建和使用等等。

其中,主键和唯一索引是数据库中非常重要的概念和技术,本文将重点探讨MySQL中主键和唯一索引的使用方法。

1. 主键的概念和作用在数据库中,主键是用于唯一标识一张表中每一行数据的字段或字段组合。

每个表只能有一个主键,并且主键的值在表中必须是唯一的,不可以为空。

主键的作用是确保数据的完整性和一致性,方便进行数据的快速查找和更新。

在MySQL中,主键可以通过以下两种方式来定义:- 在创建表的时候,使用PRIMARY KEY关键字来指定某个字段为主键。

- 在创建表后,使用ALTER TABLE语句来添加主键。

例如,创建一个名为"users"的表,其中包含id(用户ID)和name(用户名)两个字段,我们可以通过以下方式定义主键:```CREATE TABLE users (id INT PRIMARY KEY,name VARCHAR(100));```在这个例子中,我们将id字段定义为主键,MySQL会自动为id字段创建一个索引,并确保该字段在表中的值是唯一的。

2. 主键的创建和使用在MySQL中,主键可以帮助我们高效地进行数据的查找、插入和更新操作。

下面介绍几种使用主键的常见场景和技巧。

2.1 主键的自增在实际应用中,很多表都需要有一个自增的整型字段作为主键。

这样可以方便地插入新数据,并且保证每条数据的唯一性。

在MySQL中,可以通过AUTO_INCREMENT关键字来实现主键的自动增长。

例如,我们可以修改上面创建的"users"表,让id字段自动增长:```CREATE TABLE users (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(100));```这样,在插入数据时,我们就不需要手动为id字段赋值了。

MySQL唯一索引和普通索引选哪个?

MySQL唯一索引和普通索引选哪个?

MySQL唯⼀索引和普通索引选哪个?想象这样⼀个场景,在设计⼀张⽤户表时,每⼈的⾝份证号是唯⼀的,需要搜索。

但由于⾝份证号字段较⼤,不好将其作为主键。

在业务代码已经保证插⼊⾝份证唯⼀的情况下,可以选择建⽴唯⼀索引和普通索引,这时该如何选择呢?接下来,将从查询和更新的执⾏过程进⾏分析。

查询过程假设 k 是表 t 上的索引,在搜索select id from t where k=5时,会先从 k 这棵 B+ 的树根开始,按层搜索叶⼦节点,找到 k=5 的数据页,然后在数据页内容进⾏⼆分法定位。

对于普通索引,找到 k=5 的记录后,会继续向下查找⼀个,直到碰到第⼀个不是 5 的记录结束。

对于唯⼀索引,由于取值唯⼀,找到后直接停⽌。

由于 InnoDB 是按照数据页为单位(数据页默认 16 KB)进⾏读写的,在读取⼀条数据时,会将整个数据页整体读到内存。

在读⼊内存的数据页中,如果包含 k=5 的记录,在查询的情况下,唯⼀索引⽐普通索引多了⼀次查找和判断的过程,可以忽略。

如果 k=5 是当前数据页的最后⼀条,就需要在读取下⼀个数据页。

但这发⽣的概率较低,也可以忽略。

所以总得来说,普通索引和唯⼀索引在查询的过程中差异不⼤。

change buffer在分析唯⼀索引和普通索引的影响前,先来认识⼀下 change buffer 这个结构。

什么是 change buffer ?在执⾏更新操作时,如果要更新的数据页在内存中就直接更新,否则的话,在不影响数据⼀致性的前提下,InnoDB 会将更新操作缓存在 change buffer 中,从⽽省去了从磁盘读取数据页的过程。

在下次查询操作读取到恰好需要更新的数据页时,会将change buffer 的更新语句执⾏,写⼊数据页。

将操作应⽤到硬盘的过程叫 merge. 后台线程会定期 merge 或数据库正常关闭时,也会进⾏ merge 操作。

merge 的执⾏流程:1. 从磁盘读⼊⽼版本数据页。

MySQL中的主键和唯一键的设计与优化

MySQL中的主键和唯一键的设计与优化

MySQL中的主键和唯一键的设计与优化数据库是现代应用程序的核心组成部分之一,而主键和唯一键是关系型数据库中非常重要的概念。

在MySQL中,主键和唯一键的设计和优化对于确保数据一致性、提高查询性能和保证数据完整性至关重要。

本文将探讨MySQL中主键和唯一键的设计原则、常见问题以及优化方法。

1.主键和唯一键的定义和区别主键是一种用于唯一标识每个记录的属性或属性组合。

主键不允许包含重复值或空值,并且每个表只能有一个主键。

主键的设计原则是简单、稳定和唯一的。

一般情况下,我们可以使用单个整数字段作为主键,也可以使用多个字段组合作为联合主键。

唯一键也是一种用于唯一标识每个记录的属性或属性组合,与主键不同的是,唯一键允许包含空值,但不允许包含重复值。

每个表可以有多个唯一键,唯一键的设计原则是简单、稳定和尽可能唯一。

与主键相比,唯一键可以更灵活地满足特定的业务需求。

2.主键和唯一键的设计原则主键和唯一键的设计原则可以总结为以下几点:(1) 简单:主键和唯一键应该尽可能简单,避免使用复杂的字段或计算字段作为主键或唯一键,以提高性能和维护的便利性。

(2) 稳定:主键和唯一键的值应该是稳定的,不会频繁地发生变化。

如果主键或唯一键的值经常变化,会导致频繁的索引重建和数据迁移,影响性能和数据一致性。

(3) 唯一:主键和唯一键的值必须是唯一的,不能包含重复值。

唯一键可以包含空值,但重复值会导致数据冗余和数据不一致。

(4) 效率:主键和唯一键的设计应该考虑到查询的效率。

例如,使用整数字段作为主键比使用字符串字段作为主键更高效,因为整数类型的比较速度更快。

3.常见问题及解决方法在实际的数据库设计和应用过程中,主键和唯一键可能会出现一些常见问题,下面对这些问题进行探讨并提供解决方法。

(1) 主键冲突:当插入一条记录时,如果主键值已经存在,就会报主键冲突的错误。

解决方法有两种:一是使用自增长主键,让数据库自动生成唯一的主键值;二是使用UUID等全局唯一标识符作为主键,保证唯一性。

MySQL中的自增长主键和唯一索引

MySQL中的自增长主键和唯一索引

MySQL中的自增长主键和唯一索引MySQL是一种广泛应用的关系型数据库管理系统,其提供了许多强大的功能和特性,其中包括自增长主键和唯一索引。

本文将探讨这两个主题,并说明它们在MySQL中的作用和用法。

一、自增长主键在数据库中,主键是用于唯一标识每个记录的属性或一组属性。

自增长主键是一种特殊类型的主键,它能够自动增加,并保持每个记录之间的唯一性。

在MySQL中,我们可以通过使用AUTO_INCREMENT关键字来定义一个自增长主键。

具体的语法如下:CREATE TABLE table_name (id INT PRIMARY KEY AUTO_INCREMENT,...);在上述语法中,id列被定义为主键,并使用AUTO_INCREMENT关键字来指示它是一个自增长列。

通过使用自增长主键,我们可以轻松地插入新记录,而不必手动指定主键的值。

每次插入新记录时,MySQL会自动为id列分配一个新的唯一值。

自增长主键在数据库中有多个用途。

首先,它确保表中的每个记录都有一个唯一的标识符。

这对于数据的查找和更新非常重要。

其次,自增长主键有助于提高插入数据的性能。

因为MySQL会自动分配新的唯一值,插入新记录时不需要执行额外的操作来生成主键。

最后,自增长主键还有助于提高数据库的安全性。

因为它确保每个记录都具有唯一的标识符,所以其他人很难猜测到其他记录的主键值。

这对于保护敏感数据非常重要。

二、唯一索引除了自增长主键外,唯一索引是另一种在MySQL中实现数据唯一性的重要手段。

唯一索引是一种索引结构,它确保在索引列中的每个值都是唯一的。

在MySQL中,我们可以通过在列上创建唯一索引来实现数据的唯一性。

具体的语法如下:CREATE TABLE table_name (...column_name UNIQUE,...);在上述语法中,column_name是我们想要创建唯一索引的列的名称。

通过在该列上创建唯一索引,我们可以确保该列中的每个值都是唯一的。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

唯一索引与主键索引的比较
唯一索引
唯一索引不允许两行具有相同的索引值。

如果现有数据中存在重复的键值,则大多数数据库都不允许将新创建的唯一索引与表一起保存。

当新数据将使表中的键值重复时,数据库也拒绝接受此数据。

例如,如果在employee 表中的职员姓氏(lname) 列上创建了唯一索引,则所有职员不能同姓。

主键索引
主键索引是唯一索引的特殊类型。

数据库表通常有一列或列组合,其值用来唯一标识表中的每一行。

该列称为表的主键。

在数据库关系图中为表定义一个主键将自动创建主键索引,主键索引是唯一索引的特殊类型。

主键索引要求主键中的每个值是唯一的。

当在查询中使用主键索引时,它还允许快速访问数据。

它们的一些比较:
(1)对于主健/unique constraint ,oracle/sql server/mysql等都会自动建立唯一索引;
(2)主键不一定只包含一个字段,所以如果你在主键的其中一个字段建唯一索引还是必要的;
(3)主健可作外健,唯一索引不可;
(4)主健不可为空,唯一索引可;
(5)主健也可是多个字段的组合;
(6)主键与唯一索引不同的是:
a.有not null属性;
b.每个表只能有一个。

1、主键
主键ID,主键既是约束也是索引,同时也用于对象缓存的键值。

2、索引
*组合或者引用关系的子表(数据量较大的时候),需要在关联主表的列上建立非聚集索引(如订单明细表中的产品ID字段、订单明细表中关联的订单ID字段)
*索引键的大小不能超过900个字节,当列表的大小超过900个字节或者若干列的和超过900个字节时,数据库将报错。

*表中如果建有大量索引将会影响INSERT、UPDATE和DELETE 语句的性能,因为在表中的数据更改时,所有的索引都将必须进行适当的调整。

需要避免对经常更新的表进行过多的索引,并且索引应保持较窄,就是说:列要尽可能的少。

*为经常用于查询的谓词创建索引,如用于下拉参照快速查找的code、name等。

在平台现有下拉参照的查询sql语句中的like条件语句要改成不带前置通配符。

还有需要关注Order By和Group By谓词的索引设计,Order By和Group By的谓词是需要排序的,某些情况下为Order By和Group By的谓词建立索引,会避免查询时的排序动作。

*对于内容基本重复的列,比如只有1和0,禁止建立索引,因为该索引选择性极差,在特定的情况下会误导优化器做出错误的选择,导致查询速度极大下降。

*当一个索引有多个列构成时,应注意将选择性强的列放在前面。

仅仅前后次序的不同,性能上就可能出现数量级的差异。

*对小表进行索引可能不能产生优化效果,因为查询优化器在遍历用于搜索数据的索引时,花费的时间可能比执行简单的表扫描还长,设计索引时需要考虑表的大小。

记录数不大于100的表不要建立索引。

频繁操作的小数量表不建议建立索引(记录数不大于5000条)。

相关文档
最新文档