Mysql MyISAM密钥长度限制,尝试使用md5字段加快速度

Mysql MyISAM密钥长度限制,尝试使用md5字段加快速度,mysql,indexing,myisam,Mysql,Indexing,Myisam,我在小MyISAM表上工作-大约30k个条目,大小为10mb。其中一个字段是varchar(500+),因为我使用utf8\u unicode\u ci,所以我无法索引此字段(我达到了1000字节的限制),同时我需要基于此字段执行大量“get\u或\u create”查询。我试图优化数据库,但事情仍然很慢 创建额外的字段(它将保存varchar值的md5并为其编制索引/用于查找)是一个好的解决方案吗?有人尝试过这种方法吗?对我来说,使用如此宽的列作为键似乎不是一个好主意,但除此之外,你肯定可以做

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


创建额外的字段(它将保存varchar值的md5并为其编制索引/用于查找)是一个好的解决方案吗?有人尝试过这种方法吗?

对我来说,使用如此宽的列作为键似乎不是一个好主意,但除此之外,你肯定可以做一些你建议的事情。您甚至不需要使用MD5,只需要一个产生很少冲突的哈希函数,但不需要唯一性
CRC32
生成的值很小,速度非常快

假设您的桌子如下所示:

CREATE TABLE data (lots_of_text VARCHAR(500));
SELECT lots_of_text FROM data
WHERE text_hash = CRC32("lots and lots of text")
AND lots_of_text = "lots and lots of text";
将其更改为:

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"));
然后您可以检索如下所示的行:

CREATE TABLE data (lots_of_text VARCHAR(500));
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\u hash
上的索引,但由于
CRC32
不会产生唯一的值,您仍然需要检查
lots\u of\u text
字段是否相等,但查询仍然很快,因为最多有几行具有相同的hash


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

您在varchar列中存储什么类型的数据?请给出一些具体示例。此字段包含指向以下网站的链接:text\u hash=CRC32(“大量文本”)和lots\u of_text=“大量文本”;-thx,另外使用文本进行散列看起来是个好主意。