【问题标题】:MyISAM key length limitation, trying to speed things up with md5 of fieldsMyISAM 密钥长度限制,尝试使用 md5 字段加快速度
【发布时间】:2011-05-26 18:46:37
【问题描述】:

我在小型 MyISAM 表上工作 - 大约 30k 条目,大小 - 10mb。其中一个字段是 varchar(500+),因为我使用 utf8_unicode_ci 我无法索引该字段(我达到了 1000 字节的限制),同时我需要基于该字段执行大量“get_or_create”查询。我正在尝试优化数据库,但事情仍然很慢。

创建附加字段是否是一个很好的解决方案,它将保存 varchar 值的 md5 并将其索引/用于查找?有人试过这种方法吗?

【问题讨论】:

  • varchar 列中存储什么样的数据?给我们一些具体的例子。
  • 此字段包含指向网站的链接

标签: mysql indexing myisam


【解决方案1】:

对我来说,使用如此宽的列作为键似乎是个坏主意,但除此之外,您绝对可以按照您的建议进行操作。你甚至不需要使用 MD5,你所需要的只是一个产生很少冲突的哈希函数,但唯一性不是必需的。 CRC32 产生的值很小,而且速度很快。

假设你的桌子是这样的:

CREATE TABLE data (lots_of_text VARCHAR(500));

改成这样:

CREATE TABLE data (text_hash INT, lots_of_text VARCHAR(500), INDEX (text_hash));

当你插入行时:

INSERT INTO data (lots_of_text, text_hash) 
VALUES ("lots and lots of text", CRC32("lots and lots of text"));

然后你可以像这样检索行:

SELECT lots_of_text FROM data
WHERE text_hash = CRC32("lots and lots of text")
AND lots_of_text = "lots and lots of text";

查询将使用text_hash 上的索引,但由于CRC32 不会产生唯一值,您仍然需要检查lots_of_text 字段是否相等——但查询仍然很快,因为最多只有几个行将具有相同的哈希值。

一种变体是使用前 50 个字符左右作为哈希,具有相同前 50 个字符的行数很可能很少。

【讨论】:

  • WHERE text_hash = CRC32("很多很多文本") ANDlots_of_text = "很多很多文本"; - thx,这看起来是一个好主意,另外使用文本来散列。
猜你喜欢
  • 1970-01-01
  • 2017-06-26
  • 2012-01-10
  • 1970-01-01
  • 2016-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多