我用java自动生成的uuid当成主键,但这个uuid有36位,是不是太长了?会对性能造成多大的影响?谢谢

解决方案 »

  1.   

    如果你用的是InnoDB引擎,并不推荐这么做,有以下两个理由:
    1. 主键会自动生成索引,索引会占用磁盘空间;同时InnoDB在加载时,会把索引和数据都加载到innodb_buffer_pool中,也就是会占用内存;相同数据量的36位的uuid肯定比自增的id会占用更多的内存和硬盘资源。
    2. 主键使用B+Tree,这是种有序的树,uuid是无序的,在进行大量数据的插入/删除操作时会出现频繁排序操作,此时对有IO影响
    3. How-
    ever, secondary indexes (indexes that aren’t the primary key) contain the primary key
    columns, so if your primary key is large, other indexes will also be large. ---《High Performance MySQL》这里有两个老外测试的数据,大体结果是:不排序的uuid速度会慢近50%,占用空间也较大,如果是基于时间戳(timestamp)生成的有序uuid,则对速度影响并不大,但是资源占用不可避免
    http://www.percona.com/blog/2007/03/13/to-uuid-or-not-to-uuid/
    http://www.percona.com/blog/2014/12/19/store-uuid-optimized-way/
      

  2.   

    自动生成的uuid 如果对你的应用程序没有什么实际意义不建议作为主键可以考虑自增主键
      

  3.   

    是InnoDB引擎。谢谢,我认真学习学习
      

  4.   

    数据库的自增主键可以通过百度或者google搜索到很多例子
    建议先了解,有问题再进行讨论