MySQL 数据库中长度为 384 的 VARCHAR 字段的索引
我有一个 varchar(384) 来将电子邮件存储在 MyISAM 表中,我想检查电子邮件何时存在,但索引长度限制为 333 字节(因为我正在使用utf8(1000 字节/3 字节))。
那么,搜索指定电子邮件是否存在的最佳方法是什么,使用 FULLTEXT 索引或使用 BINARY(16) 中的电子邮件 md5-hash 创建另一个字段(带冲突检查)?
[编辑]
使用 1M 记录进行测试。
Fulltext index: ~300 ms
333 length index: ~15 ms
binary(16) md5-hash: ~15 ms
所以我认为最好的选择是性能上的第二个字段,但是......第二个字段=更大的表,这对性能或存储不利。因此,在电子邮件不超过 150 个字符的真实场景中,VARCHAR(384) 中的 150 长度索引就足够了。
I have a varchar(384) to store emails in a MyISAM table and I want check when the email exists but the index length limit is 333 bytes (because I'm using utf8 (1000 bytes/3 bytes)).
Then what's the best way to search if a specified email exists, using a FULLTEXT index or creating another field with the email md5-hash in a BINARY(16) (with collisions check)?
[EDIT]
Tests using 1M records.
Fulltext index: ~300 ms
333 length index: ~15 ms
binary(16) md5-hash: ~15 ms
So I think that the best option is the second field in performance, but... second field = bigger table, and that's not good for performance or storage. So in a real scenary where emails aren't bigger than 150 characters, a 150 length index in a VARCHAR(384) will be enough.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
上周,我向数据库添加了 100,000 封不同的电子邮件(缓慢的一周)。
最长的是 45 个字符。钟形曲线在 21-22 个字符处达到峰值。
因此,如果您愿意,最多可存储 384 个字符,但仅索引前 45 个字符。即使在索引返回重复项的极少数情况下,从磁盘读取基础记录的额外 I/O 也不会杀死您。
祝你好运。
In the last week, I have added 100,000 distinct emails to my database (slow week).
The longest was 45 characters long. The bell curve peaks at 21-22 characters.
So, store up to 384 if you'd like, but only index the first 45 characters. Even in the rare case when the index returns duplicates, the extra I/O to read the underlying records off disk won't kill you.
Good luck.