steelshadow39
V2EX  ›  数据库

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

  •  
  •   steelshadow39 · Oct 2, 2023 · 4679 views
    This topic created in 1130 days ago, the information mentioned may be changed or developed.

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

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

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