MySQL 数据库中长度为 384 的 VARCHAR 字段的索引

发布于 2024-09-16 05:44:15 字数 498 浏览 10 评论 0原文

我有一个 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

み零 2024-09-23 05:44:15

上周,我向数据库添加了 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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文