MySQL 主键与索引的联系与区别分析_Mysql

关系数据库依赖于主键,它是数据库物理模式的基石。主键在物理层面上只有两个用途:

惟一地标识一行。
作为一个可以被外键有效引用的对象。
索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。下面是主键和索引的一些区别与联系。

1. 主键一定是唯一性索引,唯一性索引并不一定就是主键。

所谓主键就是能够唯一标识表中某一行的属性或属性组,一个表只能有一个主键,但可以有多个候选索引。因为主键可以唯一标识某一行记录,所以可以确保执行数据更新、删除的时候不会出现张冠李戴的错误。主键除了上述作用外,常常与外键构成参照完整性约束,防止出现数据不一致。数据库在设计时,主键起到了很重要的作用。

主键可以保证记录的唯一和主键域非空,数据库管理系统对于主键自动生成唯一索引,所以主键也是一个特殊的索引。

2. 一个表中可以有多个唯一性索引,但只能有一个主键。

3. 主键列不允许空值,而唯一性索引列允许空值。

4. 索引可以提高查询的速度。

其实主键和索引都是键,不过主键是逻辑键,索引是物理键,意思就是主键不实际存在,而索引实际存在在数据库中,主键一般都要建,主要是用来避免一张表中有相同的记录,索引一般可以不建,但如果需要对该表进行查询操作,则最好建,这样可以加快检索的速度。

FAQ

1. 主键是个什么?

我来来具体的东西说吧,书大家都看过吧,没看过的找本翻一下,看下它每页是不是有个页码,我们的数据表主键就相当于是这个页码,明白了吧。

2. 那么索引是什么呢?

我们还拿书来说,索引相当于书的目录,有了目录我们可以很快的知道这本书的基本内容和结构,数据索引也一样,它可以加快数据表的查询速度。

3. 主键主索引类比,及其他们的作用?

主键是为了标识数据库记录唯一性,不允许记录重复,且键值不能为空,主键也是一个特殊索引。
数据表中只允许有一个主键,但是可以有多个索引。
使用主键会数据库会自动创建主索引,也可以在非主键上创建索引,方便查询效率。
索引可以提高查询速度,它就相当于字典的目录,可以通过它很快查询到想要的结果,而不需要进行全表扫描。
主键索引外索引的值可以为空。
主键也可以由多个字段组成,组成复合主键,同时主键肯定也是唯一索引。
唯一索引则表示该索引值唯一,可以由一个或几个字段组成,一个表可以有多个唯一索引。

时间: 2024-08-26 04:35:12

MySQL 主键与索引的联系与区别分析_Mysql的相关文章

Oracle与Mysql主键、索引及分页的区别小结_oracle

区别: 1.主键,Oracle不可以实现自增,mysql可以实现自增. oracle新建序列,SEQ_USER_Id.nextval 2.索引: mysql索引从0开始,Oracle从1开始. 3.分页, mysql: select * from user order by desc limit n ,m. 表示,从第n条数据开始查找,一共查找m条数据. Oracle:select * from user select rownum a * from ((select * from user)a

mysql主键的缺少导致备库hang住_Mysql

最近线上频繁的出现slave延时的情况,经排查发现为用户在删除数据的时候,由于表主键的主键的缺少,同时删除条件没有索引,或或者删除的条件过滤性极差,导致slave出现hang住,严重的影响了生产环境的稳定性,也希望通过这篇博客,来加深主键在innodb引擎中的重要性,希望用户在使用RDS,设计自己的表的时候,一定要为表加上主键,主键可以认为是innodb存储引擎的生命,下面我们就来分析一下这个案例(本案例的生产环境的binlog为row模式,对于myisam存储引擎也有同样的问题):(1).现象

MySQL中REPLACE INTO和INSERT INTO的区别分析_Mysql

注意,除非表有一个PRIMARY KEY或UNIQUE索引,否则,使用一个REPLACE语句没有意义.该语句会与INSERT相同,因为没有索引被用于确定是否新行复制了其它的行. [separator] 所有列的值均取自在REPLACE语句中被指定的值.所有缺失的列被设置为各自的默认值,这和INSERT一样.您不能从当前行中引用值,也不能在新行中使用值.如果您使用一个例如"SET col_name = col_name + 1"的赋值,则对位于右侧的列名称的引用会被作为DEFAULT(c

MySQL中create table as 与like的区别分析_Mysql

本文分析了MySQL中create table as 与like的区别.分享给大家供大家参考,具体如下: 对于mysql的复制相同表结构方法,有create table as 和create table like 两种,区别是什么呢? 复制代码 代码如下: create table t2 as select * from t1 where 1=2;或者 复制代码 代码如下: limit 0; as创建出来的t2表(新表)缺少t1表(源表)的索引信息,只有表结构相同,没有索引. 复制代码 代码如下

MySQL 处理插入过程中的主键唯一键重复值的解决方法_Mysql

本篇文章主要介绍在插入数据到表中遇到键重复避免插入重复值的处理方法,主要涉及到IGNORE,ON DUPLICATE KEY UPDATE,REPLACE:接下来就分别看看这三种方式的处理办法. IGNORE 使用ignore当插入的值遇到主键(PRIMARY KEY)或者唯一键(UNIQUE KEY)重复时自动忽略重复的记录行,不影响后面的记录行的插入, 创建测试表 CREATE TABLE Tignore (ID INT NOT NULL PRIMARY KEY , NAME1 INT )d

MySQL主键设计

原文:MySQL主键设计 [TOC] 在项目过程中遇到一个看似极为基础的问题,但是在深入思考后还是引出了不少问题,觉得有必要把这一学习过程进行记录. MySQL主键设计原则 MySQL主键应当是对用户没有意义的. MySQL主键应该是单列的,以便提高连接和筛选操作的效率 永远也不要更新MySQL主键 MySQL主键不应包含动态变化的数据,如时间戳.创建时间列.修改时间列等 MySQL主键应当有计算机自动生成. 主键设计的常用方案 自增ID 优点: 1.数据库自动编号,速度快,而且是增量增长,聚集

mysql 主键 在别的表里面当外键 不允许重复

问题描述 mysql 主键 在别的表里面当外键 不允许重复 在mysql数据库里面,有三张表,如下: student(no,name,class)no是主键, activity(name,time,place)name是主键, select(id,no,name)no,name是外键且分别对应表student和activity 问题:表select输入数据(1,"000'',"排球"):(2,"001'',"看书"):没问题 再输入数据(3,&q

使用Kettle数据迁移添加主键和索引

Kettle是一款国外开源的etl工具,纯java编写,绿色无需安装,主要用于数据抽取.转换.装载.kettle兼容了市面上几十种数据库,故用kettle来做数据库的迁移视乎是个不错的选择. kettle的数据抽取主要在于抽取数据,而没有考虑数据库的函数.存储过程.视图.表结构以及索引.约束等等,而这些东西恰恰都是数据迁移需要考虑的事情.当然,如果在不考虑数据库中的函数.存储过程.视图的情况下,使用kettle进行数据的迁移还算是一个可行的方案. 这篇文章主要是讲述在使用kettle进行数据库的

主键 索引 查询效率-主键和索引哪个查询效率更快??

问题描述 主键和索引哪个查询效率更快?? 1.有次面试被问到,主键和索引哪个查询更快?有没有哪个高手,能给详细解释下...在网上查了下,很多都只是给解释一统,簇聚索引和非簇聚索引,但没有特别明确给出答案.2.还有个问题是,如果在sql语句使用了函数,还能否给字段建立索引..求大侠赐教! 解决方案 1.1. 主键和索引都有很多种实现方式,对于同一种实现方式来说,速度是一样的1.2. 主键通常使用聚簇索引.可以认为聚簇索引是一种Hash索引,因此是比较快的2.用了函数能否建索引?当然是可以的.使用函