请教一下,长字符串存到数据库中有没有查询性能问题

169 天前
 NoKey
比如字段大概长度是 500 个字符,我们存到数据库
这个字段设置为索引,同时查询的时候,是等于的方式查(不是 like )
这样在数据量大起来的时候,有查询新性能问题不?
请大佬赐教一下
需不需要额外存一个字段的 md5 值,每次查询 md5 即可,这样字段值会短很多。
谢谢
1402 次点击
所在节点    数据库
14 条回复
guochenglong
169 天前
这么长的字段,索引得多大啊
KimAndBella
169 天前
1. 设置索引肯定不行,太大了
2. 存这个字段的 md5 ,有什么意义?你肯定是 like 的方式查询这个字段,不可能说全内容先 md5 再通过 md5 去查询
3. 如果这个字段内容是通用的,很多记录都会有相同的内容,那么可以考虑新增一张表,字段 1 存储全内容,字段 2 存储 md4 ,原表存储 md5
4. 如果 3 不行的话,考虑 es 吧
5. 考虑业务是否真的需要这样做
MadDoggy
169 天前
前缀索引了解一下
Huelse
169 天前
请把专业的活交给专业的工具,关系性数据库不是干这个的
ZZ74
169 天前
500 个字符的索引 光索引的存储大小就和整张表差不多了。
我都怀疑关系型数据库是否真的会去走索引。。。。
确定永远等于查询的话,md5 也可
NoKey
169 天前
@KimAndBella 多谢恢复。有个系统,鉴权的 token ,400 多个字符,我要记录这个 token ,后续要对比,就是全查,我考虑着这么长的字符,计算一个 md5 查起来是不是效率点。脑壳痛~🤣
crysislinux
169 天前
@NoKey 要不改改设计,加个短的 client id ,如果是用户系统就是 user id ,鉴权去查 client id 对应的 token 存不存在,是否还有效。登录系统也是这样设计的,没听说谁去数据库查加密了的密码的。
rekulas
169 天前
如果你是全等查询,那 md5 作为索引是正确的,速度几乎不受多少影响 即使是亿级表也在 1-10 毫秒级
june4
169 天前
我记得在哪本权威 sql 调优书里写过类似场景,就是大字符串比较要加一个索引 hash 列,不用太长(太长占过多内存,比如完整 md5 就过长,如果数据量大的话能省不少内存),md5 前 6-8 个字符足够,因为二个值出来的 hash 相同也没关系。
然在 sql 里写 where hash = ? and str_value = ?,mysql 会优先通过索引找到 hash 相同的行(一般就 1 个),然后再比较 str_value 值。
adoal
169 天前
建 hash index
xuanbg
168 天前
存着不影响性能,读的时候不批量读取很多行也没什么性能问题。建索引也不是不能建,就是太长了性能不好。如果超长了就建不了索引了。非要索引的话,建议存 hash 建索引。
xuanbg
168 天前
@NoKey 鉴权的 token 它没有自己的 id 么?我是把 token 存 redis 的,key 就是 Token:id 。这个没必要存数据库啊。
msaionyc
168 天前
直接存查询性能会非常低,当然如果数据量不大的场景其实也没问题。

MD5 摘要后加索引的方式是可行的,性能会提升非常多
dode
164 天前
把 token 存 redis 呢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/994608

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX