首页  >  问答  >  正文

java - 关于表的主键问题

主键大部分应该只有 整数型(自动递增)或者 系统生成唯一码(例如UUID);想问一下这两种各有什么利弊,希望谈一下实际的经验。

过去多啦不再A梦过去多啦不再A梦2712 天前634

全部回复(4)我来回复

  • 習慣沉默

    習慣沉默2017-05-17 10:00:34

    自增id节约存储空间,主键索引不存在插入重排序问题,缺点是数据量有限制,最多存到2^63次方条记录。
    uuid一般是字符串吧,比整形消耗更多的存储空间,插入时需要索引重排序。原则上数量是没有上限。

    回复
    0
  • PHP中文网

    PHP中文网2017-05-17 10:00:34

    整数型(mysql的索引是以文件形式保存,所以整数型肯定比UUID要小),而且由于是整数型,索引的效率也肯定比UUID要高,但由于是自动递增,所以mysql在每次插入数据时候,就要对表进行锁表,导致在大量并发之下,对mysql服务器开销特别大。而UUID就在处理并发方面比整数自增的好

    回复
    0
  • 淡淡烟草味

    淡淡烟草味2017-05-17 10:00:34

    uuid 支持分库

    回复
    0
  • 習慣沉默

    習慣沉默2017-05-17 10:00:34

    字段为主键时,整数型比字符串型节省空间(你应该记得int只需4个字节吧,char一个字符一个字节)
    字段不为主键时,除了节省空间,整数型比字符串型快很多,根据字符长度呈几何倍数增长

    对于追求完美的,像ip地址这种数据,也是用整数保存在数据库中的(IP地址字符串与整数有一套固定的算法)。

    举个例子;假如一个字段的值为1234567890,没有主键的情况下
    做sql查询时 where id >= '1234567890'
    int型只需比较1次
    char型需要比较10次,每个字符都要参与比较。所以字符越长,速度越慢

    如果数据库的数据量足够大,你执行类似sql也能很容易检验处char型的速度
    where id like '123%' limit 5;
    where id like '1234%' limit 5;
    where id like '12345%' limit 5;
    where id like '123456%' limit 5;
    以上sql,执行速度依次更慢。因为字符越长,参与比较的次数越多。

    而int型无论长短,只比1次

    回复
    0
  • 取消回复