本人学生,没有大型项目开发经验。问题描述如下,请教各位前辈。
我的想法是:cpeName 字段太长了,不适合作为主键; cpeNameid 和 UUID 差不多,作为索引查找和插入效率都很低。因为查询数据时绝大多数情况都会以 cpeName 作为查询条件,所以如果以自增 ID 作为主键,基本上很少用到 ID ,而且自增 ID 和其他列毫无关联关系,最终还是需要在 cpeName 上建索引。
感谢各位前辈指点。
1
liprais 2023-10-02 17:55:58 +08:00 via iPhone
100w 随便选
|
2
iOCZ 2023-10-02 17:59:31 +08:00
主键用哪个取决于搜索需求吧
|
3
yinmin 2023-10-02 18:03:00 +08:00 via iPhone
正解:jiq yi gy 长整型自增字段做主健,其他字段可做索引
|
4
yinmin 2023-10-02 18:03:37 +08:00 via iPhone
正解:添加一个长整型自增字段做主健,其他字段可做索引
|
5
steelshadow39 OP @iOCZ 是的,cpeName 还能保证数据唯一性,其他常用的搜索字段都无法保证数据唯一性
|
6
igeeky 2023-10-02 18:06:48 +08:00
如果 cpeName 没有范围查询需求, 也不会用 LIKE 进行查询, 可以用 hash 索引. 这样索引会小很多.
MYSQL 是支持 hash 类型的索引的. 如果数据库不支持 hash 索引, 你也可以自己用 cpeName 的 hash(比如 mmhash, crc64 等)作为主键. 这样查询时,只要自己 hash 一下, 再用 hash 值查询就行. |
7
steelshadow39 OP @igeeky 好的,谢谢
|
8
steelshadow39 OP @yinmin 如果我用自增主键,再给 cpeName 添加索引,那么相比直接把 cpeName 作为主键索引,不是更浪费空间了吗?
|
9
esee 2023-10-02 18:39:55 +08:00 1
100 万的数据量?你索引都不加性能也不会差,除非在你用的 20 年前的机器来跑数据库。
提个建议,如果是自己做着玩的项目,好的想法和需求 比编码能力更重要,做产品第一步是做出来且有人用,不然搞再好的性能 其实意义并不大 |
10
ytmsdy 2023-10-02 18:54:29 +08:00
才 100w 而已。搞一个数字自增的主键就好了。
|
11
yinmin 2023-10-02 19:30:53 +08:00 via iPhone
@steelshadow39 主健索引一般是给其他表做 join 关联引用的。你可以 2 选 1 ( 1 )添加一个自增长整数 ( 2 )把 cpenameid 转换成 16 字节二进制格式保存到数据库,然后做主健。2 种方案的效率都不错的。
|
12
yinmin 2023-10-02 19:35:14 +08:00 via iPhone
mysql 有 UUID_TO_BIN()函数可以直接处理 cpenameid ,转换成 BIN 后效率会很高的
|
13
makelove 2023-10-02 20:12:16 +08:00 2
@steelshadow39 万一你的表有别的索引呢,其它索引会用主键当指针指回数据行,你的主键搞这么大会导致这个表的所有索引体积都大很多,不利于保持在内存
|
14
wangyongbo 2023-10-02 20:18:01 +08:00 via iPhone
你可以先用 自增 ID 做主键测试一下性能看看。 做个实验就知道了。
|
15
cabing 2023-10-02 20:49:46 +08:00
单个字段查询,把需要索引的字段 md5 以下。以这个 md5 作为索引?
100w 真的是很少了。随便玩都行。。 |
16
Belmode 2023-10-02 20:52:38 +08:00
使用 MySQL 自增字段作为主键,那两个业务字段做索引就行了。
500W 数据基本无压力。 |
17
fzdwx 2023-10-02 21:35:15 +08:00 1
主键最好是递增的数字类型且与业务无关
|
18
IvanLi127 2023-10-02 21:42:00 +08:00 via Android
这个数据量,不想纠结就直接加个 id 字段
|
19
CQdake 2023-10-02 22:02:41 +08:00
@makelove #13 说得对,是哈。
使用 cpeNmae 做主键的缺点: ①主键太大,性能就降低了; ②cpeName 不是自增的,数据的前后顺序是随机存放的,每一次增删都需要调整很多条数据,自增主键,直接按顺序在末尾添加就好了; |
20
steelshadow39 OP 明白了,先用自增 ID 试了,谢谢大家
|
21
yrj 2023-10-03 10:50:13 +08:00
不说才 100w 数据的事情,正确做法是用自增 id 做主键,可以让数据排列更密实
|
22
aelloncs 2023-10-03 12:16:09 +08:00
小菜鸡表示,你要说主键,那我只能说整数型自增主键,没有的话就新增一列
|
23
Flourite 2023-10-03 12:22:40 +08:00
1. 所有二级索引都会包含主键,不建议使用 cpeName 做主键
2. 嫌 cpeName 太长可以用 hash 索引 |
24
RangerWolf 2023-10-03 22:01:45 +08:00 1
推荐看看阿里的那个 Java 开发手册,里面有专门 MySQL 的章节,非常值得学习。
|
25
spediacn 361 天前 via iPhone
uuid 用二进制存效率可比字符串高多了
|