一、复合主键与联合主键
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;类似的语句来进行分析和查询联合索引