复合主键与联合主键、索引与联合(复合)索引

前几天面试时被问到了MySql中联合索引使用与生效问题;回来顺便看了一下复合主键与联合主键,查漏补缺,慢慢学习吧。

一、复合主键与联合主键

1、复合主键:指表的主键含有一个以上的字段组成,不使用无业务含义的自增id作为主键。

create table test

(

   name varchar(19),

   id number,

   value varchar(10),

   primary key (name,id)

)

上面的name和id字段组合起来就是test表的复合主键 ,它的出现是因为name字段可能会出现重名,所以要加上id字段,这样就可以保证记录的唯一性 ,一般情况下,主键的字段长度和字段数目越少越好 。 

“当表中只有一个主键时,它是唯一的索引;当表中有多个主键时,称为复合主键,复合主键联合保证唯一索引” 。

某几个主键字段值出现重复是没有问题的,只要不是有多条记录的所有主键值完全一样,就不算重复。

2、联合主键顾名思义就是多个主键联合形成一个主键组合。 

联合主键的意义:用2个字段(或者多个字段)来确定一条记录。说明:这2个字段可以都不唯一,即2个字段可以分别重复,这么设置的好处,可以很直观的看到某个重复字段的记录条数。 

举例: 主键A跟主键B组成联合主键 

主键A跟主键B的数据可以完全相同,联合就在于主键A跟主键B形成的联合主键是唯一的。 

下例主键A数据是1,主键B数据也是1,联合主键其实是11,11是唯一值,不允许再出现11这个值(即为多对多关系)

主键A数据   主键B数据 

   1      1 

   2      2 

   3      3 

主键A与主键B的联合主键值最多为: 11、 12、 13、 21、 22、 23、 31、 32、 33。

二、索引、联合(组合)索引

1.索引是加快查询速度的有效手段。系统在存取数据时会自动选择合适的索引作为存取路径。

创建索引:create [unique] [cluster] index <索引名>

删除索引:drop index <索引名>

索引是各种关系数据库系统最常见的一种逻辑单元,是关系数据库系统举足轻重的重要组成部分,对于提高检索数据速度有着至关重要的作用,索引的原理是根据索引值得到行指针,然后快速定位到数据库记录。

索引的使用

1). 主键(默认是自带索引的)和外键(以及一些可以跟其他表关联的字段) 

2). where子句中经常出现的字段 

3). 索引应该建在小字段上,大数据字段(bit,image,text,blob等)不适用

2.联合(复合)索引------ 最左匹配原则

创建联合索引:create index <索引名称> on 表名 (字段1,字段2...);

例如:有联合索引(a,b,c,d)

select * from test where a=1 and b=2;----a和b索引都起作用

索引生效原则:按照联合索引的顺序,从前往后依次使用生效,如果中间某个索引没有使用,那么断点前面的索引部分起作用,断点后面的索引没有起作用

例如:where a=1 and b=2 and d=4;则只有a和b索引起作用,中间c断了,则d索引不起作用。

mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配。

比如where a = 1 and b = 2 and c > 3 and d = 4 ,如果建立(a,b,c,d)顺序的索引,d是用不到索引的,因为c出现了“>”。

如果建立(a,b,d,c)的索引则where a = 1 and b = 2 and c > 3 and d = 4 中abcd都可以用到索引,并且a,b,d的顺序可以任意调整,即:select * from test where b=2 and d=4 and a=1and c>3中a,b,c,d也都用到了索引。

注意:

1)只要列中包含有NULL值都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那么这一列对于此复合索引就是无效的。所以我们在数据库设计时不要让字段的默认值为NULL。

2)一般情况下不鼓励使用like操作,如果非使用不可,如何使用也是一个问题。like “%aaa%” 不会使用索引而like “aaa%”可以使用索引。

3)NOT IN和操作都不会使用索引将进行全表扫描。NOT IN可以NOT EXISTS代替。

补充:

可以在Navicat中建立一张表,并建立一个联合(复合)索引,在表中插入一些数据,之后利用Explain SELECT * FROM 表名 where 索引字段名1= value1 and 索引字段名2=value2 and 索引字段名3>value3;类似的语句来进行分析和查询联合索引。

详情可查看 https://blog.csdn.net/y1193329479/article/details/78821139

 

你可能感兴趣的:(数据库相关)