关于MySql数据库主键及索引的区别

一、什么是索引?
索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存。如果没有索引,执行查询时MySQL必须从第一个记录开始扫描整个表的所有记录,直至找到符合要求的记录。表里面的记录数量越多,这个操作的代价就越高。如果作为搜索条件的列上已经创建了索引,MySQL无需扫描任何记录即可迅速得到目标记录所在的位置。如果表有1000个记录,通过索引查找记录至少要比顺序扫描记录快100倍。   

二、索引的类型
MySQL提供多种索引类型供选择:

普通索引
这是最基本的索引类型,而且它没有唯一性之类的限制。普通索引可以通过以下几种方式创建:
创建索引,例如CREATE INDEX <索引的名字> ON tablename (列的列表);
修改表,例如ALTER TABLE tablename ADD INDEX [索引的名字] (列的列表);
创建表的时候指定索引,例如CREATE TABLE tablename ( [...], INDEX [索引的名字] (列的列表) );

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

主键
主键是一种唯一性索引,但它必须指定为“PRIMARY KEY”。如果你曾经用过AUTO_INCREMENT类型的列,你可能已经熟悉主键之类的概念了。主键一般在创建表的时候指定,例如“CREATE TABLE tablename ( [...], PRIMARY KEY (列的列表) ); ”。但是,我们也可以通过修改表的方式加入主键,例如“ALTER TABLE tablename ADD PRIMARY KEY (列的列表); ”。每个表只能有一个主键。

全文索引
MySQL从3.23.23版开始支持全文索引和全文检索。在MySQL中,全文索引的索引类型为FULLTEXT。全文索引可以在VARCHAR或者TEXT类型的列上创建。它可以通过CREATE TABLE命令创建,也可以通过ALTER TABLE或CREATE INDEX命令创建。对于大规模的数据集,通过ALTER TABLE(或者CREATE INDEX)命令创建全文索引要比把记录插入带有全文索引的空表更快。本文下面的讨论不再涉及全文索引,要了解更多信息,请参见MySQL documentation。

索引的缺点
到目前为止,我们讨论的都是索引的优点。事实上,索引也是有缺点的。

首先,索引要占用磁盘空间。通常情况下,这个问题不是很突出。但是,如果你创建每一种可能列组合的索引,索引文件体积的增长速度将远远超过数据文件。如果你有一个很大的表,索引文件的大小可能达到操作系统允许的最大文件限制。

第二,对于需要写入数据的操作,比如DELETE、UPDATE以及INSERT操作,索引会降低它们的速度。这是因为MySQL不仅要把改动数据写入数据文件,而且它还要把这些改动写入索引文件。

索引与主键的主要区别有
主键是一种约束,唯一索引是一种索引,两者在本质上是不同的。

主键创建后一定包含一个唯一性索引,唯一性索引并不一定就是主键。

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

主键列在创建时,已经默认为空值 + 唯一索引了。

主键可以被其他表引用为外键,而唯一索引不能。

一个表最多只能创建一个主键,但可以创建多个唯一索引。

主键更适合那些不容易更改的唯一标识,如自动递增列、身份证号等。

在 RBO 模式下,主键的执行计划优先级要高于唯一索引。 两者可以提高查询的速度。

-- 创建一张仅包含主键和唯一索引的表

CREATE TABLE test

(PrimaryKey VARCHAR2(20),

UniqueKey  VARCHAR2(20)

);

-- 分别创建主键和唯一索引,语法不同

ALTER TABLE test ADD CONSTRAINT test_PrimaryKey PRIMARY KEY (PrimaryKey);

CREATE UNIQUE INDEX test_UniqueKey ON test (UniqueKey);

-- 在 USER_INDEXES 中可以看到两个索引名称

SELECT table_name,table_type,index_name,index_type,uniqueness

FROM USER_INDEXES

WHERE TABLE_NAME=‘TEST‘;

-- 在 USER_IND_COLUMNS 中可以看到两个索引字段名称

SELECT table_name,index_name,column_name,column_position

FROM USER_IND_COLUMNS

WHERE TABLE_NAME=‘TEST‘;

-- 在 USER_CONSTRAINTS 仅可以看到主键约束名称

SELECT table_name,constraint_name,constraint_type

FROM USER_CONSTRAINTS

WHERE TABLE_NAME=‘TEST‘;

-- 在 USER_CONS_COLUMNS 仅可以看到主键约束字段名称

SELECT table_name,constraint_name,column_name,position

FROM USER_CONS_COLUMNS

WHERE CONSTRAINT_NAME IN (SELECT CONSTRAINT_NAME

FROM USER_CONSTRAINTS

WHERE TABLE_NAME=‘TEST‘);

-- 为唯一索引增加一个非空约束

ALTER TABLE test MODIFY UniqueKey NOT NULL;

-- 在 USER_CONSTRAINTS 仅可以看到主键约束名称和非空约束名称

SELECT table_name,constraint_name,constraint_type

FROM USER_CONSTRAINTS

WHERE TABLE_NAME=‘TEST‘

-- 在 USER_CONS_COLUMNS 仅可以看到主键约束字段名称和非空约束字段名称

SELECT table_name,constraint_name,column_name,position

FROM USER_CONS_COLUMNS

WHERE CONSTRAINT_NAME IN (SELECT CONSTRAINT_NAME

FROM USER_CONSTRAINTS

WHERE TABLE_NAME=‘TEST‘)

原文地址:https://www.cnblogs.com/-zpy/p/9123835.html

时间: 2024-11-11 03:39:28

关于MySql数据库主键及索引的区别的相关文章

SQL Server数据库主键与索引的几点区别

我们在使用SQL Server数据库的时候常常会创建主键和索引,那么主键和索引到底有什么样的不同呢?本文我们主要介绍了主键和索引的区别. 主键和索引的区别如下: 主键是索引,但索引不一定是主键. 主键具有唯一性,而只有唯一性索引才具有唯一性;主键的值不能为空,不能重复. 索引可以在程序中动态创建删除.也可以是任何有序的字段. 如果在一个表中,列A.B.C   被设为主键的情况下,当需要将A,B,C 设为索引时,A,B,C被设为主键,数据库自动会建立索引,不需要再建索引:另外需要对列A,B,C,D

Mysql数据库主键,外键,索引概述

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

数据库主键和索引关联

一直以来不能够分清主键和索引的关系,在此梳理以备不时之需 1.主键 主键就是能够唯一标识表中某一行的属性或属性组,一个表只能有一个主键,但可以有多个候选索引. 主键主要作用:1.惟一地标识一行. 2.作为一个可以被外键有效引用的对象. 2.索引 包含着对数据表里所有记录的引用指针. 区别:  一个表中可以有多个唯一性索引,但只能有一个主键.  主键列不允许空值,而唯一性索引列允许空值. 主键一定是唯一性索引,唯一性索引并不一定就是主键. 联系: 主键是为了标识数据库记录唯一性,不允许记录重复,且

mysql,主键与索引的区别和联系

关系数据库依赖于主键,它是数据库物理模式的基石.主键在物理层面上只有两个用途: 惟一地标识一行. 作为一个可以被外键有效引用的对象. 索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针.下面是主键和索引的一些区别与联系. 1. 主键一定是唯一性索引,唯一性索引并不一定就是主键. 所谓主键就是能够唯一标识表中某一行的属性或属性组,一个表只能有一个主键,但可以有多个候选索引.因为主键可以唯一标识某一行记录,所以可以确保执行数据更新.删除的

数据库主键

在我们的数据库设计中,不可逃避的就是数据库表的主键,可能有很多朋友没有深入思考过,主键的设计对整个数据库的设计影响很大,因此我们不得不要重视起来. 主键的必要性 : 在有些数据库中,虽然主键不是必需的,但最好为每个表都设置一个主键,不管是单主键还是复合主键.它存在代表着表结构的完整性,表的记录必须得有唯一区分的字段,主键主要是用于其他表的外键关联,以及本记录的修改与删除. 主键的无意义性 : 在开发过程中,读者可能会看到将一些表使用有意义的字段表示主键,例如"用户登录信息表"将&quo

数据库主键的设计和思考

转载至:http://blog.csdn.net/likika2012/article/details/9949949 1. 何谓数据库主键 数据库主键是指表中一个列或列的组合,其值能唯一地标识表中的每一行.这样的一列或多列称为表的主键,通过它可强制表的实体完整性.当创建或更改表时可通过定义 PRIMARY KEY约束来创建主键.一个表只能有一个 PRIMARY KEY 约束,而且 PRIMARY KEY 约束中的列不能接受空值.由于 PRIMARY KEY约束确保唯一数据,所以经常用来定义标识

数据库主键和外键

1 什么是主键 外键 学生表(学号,姓名,性别,班级)   学号是一个主键 课程表(课程号,课程名,学分) 课程号是一个主键 成绩表(学号,课程号,成绩) 学号和课程号的属性组构成一个主键 成绩表中的学号不是成绩表的主键,不过是学生表的主键,成绩表的外键,同理课程号也是成绩表的外键 定义:如果公共关键字在一个关系中是主关键字,那么这个公共关键字被称为另一个关系的外键 以一个关系的外键作主关键字的表被称为主表,具有此外键的表被称为主表的从表 2 外键的作用 外键用于保持数据一致性,完整性 主要目的

关于数据库主键的选择

数据库主键的选择 (原创) 工作了这么多年什么数据库的主键都用过,各种项目各种主键的变更,硬伤等等的问题都遇见过. 关与主键首先不要整个系统只使用一种方式的主键,要彻底吃透业务需求,根据需求考虑每张表的主键要怎么设计能给你带来最大的收益. 数据库常用的主键常用的四种:自增编号.Guid.自定义唯一.联合主键. 关于数据库主键的设计,如果设计的合理,会给整个系统带来很多优势.例如:降低开发难度少写很多代码.数据库检索效率.开移植性.可扩展性.可维护性.易读性等...对与主键来说,没有最好的,只有最

oracle 数据库主键自动增长sql

我们都知道,在MySQL中,要实现主键的自动递增非常简单.只需要在主键定义的后面加上auto_increment即可, 但是在Oracle中就不是这样,需要分几步来完成 1.建立一个表 create table 户口本  (    户号                   INTEGER                         not null,    户别                   CHAR(20)                        not null,    户主