100W 数据量,数据库主键选择 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
steelshadow39
V2EX    数据库

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

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

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

    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
    F281M6Dh8DXpD1g2
        1
    F281M6Dh8DXpD1g2  
       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
    正解:jiqyigy 长整型自增字段做主健,其他字段可做索引
    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 数据基本无压力。
    lllllliiii
        17
    lllllliiii  
       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  
       2023-10-03 10:50:13 +08:00
    不说才 100w 数据的事情,正确做法是用自增 id 做主键,可以让数据排列更密实
    066aQg6jasP39ov4
        22
    066aQg6jasP39ov4  
       2023-10-03 12:16:09 +08:00
    小菜鸡表示,你要说主键,那我只能说整数型自增主键,没有的话就新增一列
    dV9zZM1wROuBT16X
        23
    dV9zZM1wROuBT16X  
       2023-10-03 12:22:40 +08:00
    1. 所有二级索引都会包含主键,不建议使用 cpeName 做主键
    2. 嫌 cpeName 太长可以用 hash 索引
    RangerWolf
        24
    RangerWolf  
       2023-10-03 22:01:45 +08:00   1
    推荐看看阿里的那个 Java 开发手册,里面有专门 MySQL 的章节,非常值得学习。
    spediacn
        25
    spediacn  
       2023-11-10 09:21:22 +08:00 via iPhone
    uuid 用二进制存效率可比字符串高多了
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1017 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 31ms UTC 18:31 PVG 02:31 LAX 10:31 JFK 13:31
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86