对MySQL数据库的文本列进行索引是否正确?

对MySQL数据库的文本列进行索引是否正确?,mysql,indexing,Mysql,Indexing,我有一个从字符串到整数的映射。为了将此映射存储在MySQL数据库中,我创建了下表: CREATE TABLE map( Argument TEXT NOT NULL, Image INTEGER NOT NULL ) 我为参数选择了文本类型,因为它的长度不可预测,目前最长的记录有2290个字符,平均长度为88个字符 遇到性能问题后,我尝试在参数列上添加索引,但发现必须指定长度,因此为了避免此限制,我添加了一个新的整数列,其中包含参数列值的哈希值(md5或其他值) ALTER TABLE

我有一个从字符串到整数的映射。为了将此映射存储在MySQL数据库中,我创建了下表:

CREATE TABLE map(
  Argument TEXT NOT NULL,
  Image INTEGER NOT NULL
)
我为参数选择了文本类型,因为它的长度不可预测,目前最长的记录有2290个字符,平均长度为88个字符

遇到性能问题后,我尝试在
参数
列上添加索引,但发现必须指定长度,因此为了避免此限制,我添加了一个新的整数列,其中包含参数列值的哈希值(md5或其他值)

ALTER TABLE map ADD COLUMN ArgumentHash INTEGER;
综合指数

CREATE INDEX argument_index USING HASH ON map(ArgumentHash, Argument(80));
从那时起,性能问题就消失了。我想问一下,这是否是解决这个问题的正确方法。

我认为没有“正确”的方法,这取决于您使用该专栏的目的

根据我的经验,必须/想要在一个大的文本列上进行选择是不常见的;文本通常是由其他键检索的数据(除非以其他方式索引-egs.full text,Lucene-但这似乎不是您正在做的事情)

如果您确实需要一个大字段上的精确匹配,那么使用散列可能更有效,因为它可能会让您保持索引更小。我的猜测是,如果需要使用大于散列大小的索引大小(取决于值与文本开头的距离通常不同),请使用散列


你最好试试看。使用代表性数据分析这两种方法并找出答案。

我发现VARCHAR可能是用于索引的更好的列类型,因为VARCHAR与文本不同,它是内联存储的,并且对于频繁访问的数据提供了更好的性能。