PK数据库 联合主键和自增主键

主键:主键是用来干嘛的?一般来说是为了建立唯一标识,建立索引的。

主键的使用目的:

a.为了保证数据查找唯一;

b.提高存储效率和索引效率。

索引:如果表的读操作少或者没有,索引效率会高,如果表的写操作较多或者大量,建立索引会慢。

主键的设置方法有3种:

一种是设置自增长主键,第二种是采用业务主键,第三种是生成唯一序列(使用uuid/guid);
如何选择主键设置方式:

必须按情况来看:

 1.使用业务联合主键:

a.是否绝大部分查询都是能用上联合主键的查询,并且没有其它查询方式join到这个表,也没有其它索引和外键,那么适合联合主键+cluster key,这样查询效率高一些。

b.联合主键和自增主键在查询上没什么性能上的区别(前提是索引相同,运用得当)。写的性能上是有区别的,因为联合主键会使用更多的block去创建索引,所以在写操作上性能要低一些。

2.使用生成唯一的序列
 a.如果不满足使用自增的要求,则建议优先使用字符主键。类似网站数据库,可以采用uuid、guid这类无规则字符做主键。因为字符主键查询速度不比自增主键慢。

b.UUID.randomUUID().toString()是javaJDK提供的一个自动生成主键的方法。UUID(Universally Unique Identifier)全局唯一标识符,是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的,是由一个十六位的数字组成,表现出来的形式。由以下几部分的组合:当前日期和时间(UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过几秒又生成一个UUID,则第一个部分不同,其余相同),时钟序列,全局唯一的IEEE机器识别号(如果有网卡,从网卡获得,没有网卡以其他方式获得),这样对于分库分表的情况就会很适用。UUID的唯一缺陷在于生成的结果串会比较长。

c.防止注入式攻击,当我们使用主键自增的时候,需要删除一个东西的时候,一般都是id=?。这样的话我就可以在url中修改这个id的值,这样可能就被人删除了其他东西,UUID这个就是给主键id加上一层锁,使它不暴露给用户;

3.使用自增主键的场景:

其它大部分情况仍然适合自增主键。

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