MySQL选择标识符

328 阅读2分钟

这是我参与8月更文挑战的第26天,活动详情查看:8月更文挑战

猫和老鼠.jpg

前言:   本篇文章 是我关于MySQL的第26篇文章,水平一般、能力有限。文章写的比较浅,适合新手来看。本篇文章介绍MySQL选择标识符。

选择标识符

MySQL中的选择标识符也被称为行的唯一标识。不同的数据类型对其查询插入的速度会有很大的影响。而且在进行关联查询和外键时,多表内的该字段要统一。如果不同的表中数据类型不同可能会造成性能问题,也有可能会造成数据异常。一般像字符串类型和整数类型最容易出现这种问题。

当选择标识列的类型时,不仅仅需要考虑存储类型,还需要考虑MySQL对这种类型怎么执行计算和比较。

就像MySQL中的枚举类型,实际上在计算是整数类型。如下。

select * from person;
id|sex  |
--+-----+
 1|man  |
 2|woman|

select sex+0 from person;
sex+0|
-----+
  1.0|
  2.0|

在考虑到数量的情况下,要预留一些空间出来,然后选择比较合适的数据类型;

如果该字段一般不会变,那就固定该字段的长度。如身份证号,手机号等等。

整数类型

在使用整数类型充当标识类是不错的选择,但是注意truncate表时,自增序列会从0开始。

字符串类型

虽然字符串类型不是最佳选择,并且比较消耗空间。但是它作为业务主键一般具有唯一标识。像表名+后缀用作其他表外键时会比较好辨认。尤其是在MyISAM表里使用字符串作为标识列时要特别小心。MyISAM默认对字符串使用压缩索引,这会导致查询慢很多。

随机字符串: 如果没有业务意义的字符串充当唯一标识,我是极为不推荐的。这种情况下自增或者Hash值都是比较好的选择。

函数生成的随机字符串因为会随机分布到不同的存储位置,逻辑上的地址都是不相邻的。这样会导致插入变得很慢,查询也是这样的原理。