V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
steelshadow39
V2EX  ›  数据库

100W 数据量,数据库主键选择

  •  
  •   steelshadow39 · 197 天前 · 2951 次点击
    这是一个创建于 197 天前的主题,其中的信息可能已经有所发展或是发生改变。

    本人学生,没有大型项目开发经验。问题描述如下,请教各位前辈。

    1. 数据描述:
      • 可能作为主键的两个属性示例:
        1. cpeName": "cpe:2.3:a:3com:3cdaemon:-:::::::*",
        2. cpeNameId": "BAE41D20-D4AF-4AF0-AA7D-3BD04DA402A7"
      • 数据量:100W 左右
    2. 数据库选用 MySQL ,innodb

    我的想法是:cpeName 字段太长了,不适合作为主键; cpeNameid 和 UUID 差不多,作为索引查找和插入效率都很低。因为查询数据时绝大多数情况都会以 cpeName 作为查询条件,所以如果以自增 ID 作为主键,基本上很少用到 ID ,而且自增 ID 和其他列毫无关联关系,最终还是需要在 cpeName 上建索引。

    感谢各位前辈指点。

    25 条回复    2023-11-10 09:21:22 +08:00
    liprais
        1
    liprais  
       197 天前 via iPhone
    100w 随便选
    iOCZ
        2
    iOCZ  
       197 天前
    主键用哪个取决于搜索需求吧
    yinmin
        3
    yinmin  
       197 天前 via iPhone
    正解:jiq yi gy 长整型自增字段做主健,其他字段可做索引
    yinmin
        4
    yinmin  
       197 天前 via iPhone
    正解:添加一个长整型自增字段做主健,其他字段可做索引
    steelshadow39
        5
    steelshadow39  
    OP
       197 天前
    @iOCZ 是的,cpeName 还能保证数据唯一性,其他常用的搜索字段都无法保证数据唯一性
    igeeky
        6
    igeeky  
       197 天前
    如果 cpeName 没有范围查询需求, 也不会用 LIKE 进行查询, 可以用 hash 索引. 这样索引会小很多.
    MYSQL 是支持 hash 类型的索引的.
    如果数据库不支持 hash 索引, 你也可以自己用 cpeName 的 hash(比如 mmhash, crc64 等)作为主键. 这样查询时,只要自己 hash 一下, 再用 hash 值查询就行.
    steelshadow39
        7
    steelshadow39  
    OP
       197 天前
    @igeeky 好的,谢谢
    steelshadow39
        8
    steelshadow39  
    OP
       197 天前
    @yinmin 如果我用自增主键,再给 cpeName 添加索引,那么相比直接把 cpeName 作为主键索引,不是更浪费空间了吗?
    esee
        9
    esee  
       197 天前   ❤️ 1
    100 万的数据量?你索引都不加性能也不会差,除非在你用的 20 年前的机器来跑数据库。
    提个建议,如果是自己做着玩的项目,好的想法和需求 比编码能力更重要,做产品第一步是做出来且有人用,不然搞再好的性能 其实意义并不大
    ytmsdy
        10
    ytmsdy  
       197 天前
    才 100w 而已。搞一个数字自增的主键就好了。
    yinmin
        11
    yinmin  
       197 天前 via iPhone
    @steelshadow39 主健索引一般是给其他表做 join 关联引用的。你可以 2 选 1 ( 1 )添加一个自增长整数 ( 2 )把 cpenameid 转换成 16 字节二进制格式保存到数据库,然后做主健。2 种方案的效率都不错的。
    yinmin
        12
    yinmin  
       197 天前 via iPhone
    mysql 有 UUID_TO_BIN()函数可以直接处理 cpenameid ,转换成 BIN 后效率会很高的
    makelove
        13
    makelove  
       197 天前   ❤️ 2
    @steelshadow39 万一你的表有别的索引呢,其它索引会用主键当指针指回数据行,你的主键搞这么大会导致这个表的所有索引体积都大很多,不利于保持在内存
    wangyongbo
        14
    wangyongbo  
       197 天前 via iPhone
    你可以先用 自增 ID 做主键测试一下性能看看。 做个实验就知道了。
    cabing
        15
    cabing  
       197 天前
    单个字段查询,把需要索引的字段 md5 以下。以这个 md5 作为索引?

    100w 真的是很少了。随便玩都行。。
    Belmode
        16
    Belmode  
       197 天前
    使用 MySQL 自增字段作为主键,那两个业务字段做索引就行了。
    500W 数据基本无压力。
    fzdwx
        17
    fzdwx  
       197 天前   ❤️ 1
    主键最好是递增的数字类型且与业务无关
    IvanLi127
        18
    IvanLi127  
       197 天前 via Android
    这个数据量,不想纠结就直接加个 id 字段
    CQdake
        19
    CQdake  
       197 天前
    @makelove #13 说得对,是哈。
    使用 cpeNmae 做主键的缺点:
    ①主键太大,性能就降低了;
    ②cpeName 不是自增的,数据的前后顺序是随机存放的,每一次增删都需要调整很多条数据,自增主键,直接按顺序在末尾添加就好了;
    steelshadow39
        20
    steelshadow39  
    OP
       197 天前
    明白了,先用自增 ID 试了,谢谢大家
    yrj
        21
    yrj  
       197 天前
    不说才 100w 数据的事情,正确做法是用自增 id 做主键,可以让数据排列更密实
    aelloncs
        22
    aelloncs  
       197 天前
    小菜鸡表示,你要说主键,那我只能说整数型自增主键,没有的话就新增一列
    Flourite
        23
    Flourite  
       197 天前
    1. 所有二级索引都会包含主键,不建议使用 cpeName 做主键
    2. 嫌 cpeName 太长可以用 hash 索引
    RangerWolf
        24
    RangerWolf  
       196 天前   ❤️ 1
    推荐看看阿里的那个 Java 开发手册,里面有专门 MySQL 的章节,非常值得学习。
    spediacn
        25
    spediacn  
       159 天前 via iPhone
    uuid 用二进制存效率可比字符串高多了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   4575 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 05:34 · PVG 13:34 · LAX 22:34 · JFK 01:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.