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

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

  •  
  •   steelshadow39 · 2023-10-02 17:52:46 +08:00 · 3164 次点击
    这是一个创建于 365 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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