2010-02-15 46 views
9

我有一个从字符串到整数的映射。存储该地图在MySQL数据库中,我创建了如下表:这是索引MySQL数据库的TEXT列的正确方法吗?

CREATE TABLE map(
    Argument TEXT NOT NULL, 
    Image INTEGER NOT NULL 
) 

我选择的参数文本类型,因为它的长度是不可预知的,目前最长的记录有2290个字符,平均长度为88个字符。

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

ALTER TABLE map ADD COLUMN ArgumentHash INTEGER; 

并结合指数

CREATE INDEX argument_index USING HASH ON map(ArgumentHash, Argument(80)); 

自那时以来,其性能的问题已经消失。我想问问这是否是解决这个问题的正确方法。

回答

3

我不认为有一个“正确”的方式,这取决于你正在使用的列。

根据我的经验,必须/想要在大型文本列上进行选择是很不寻常的;文本通常是通过一些其他键检索数据(除非以其他方式索引 - 例如,全文,Lucene - 但这似乎并不是你正在做的)

如果你确实需要确切的匹配一个大的字段,那么使用散列可能会更高效,因为它可能会让您保持索引更小。我的猜测是,如果您需要使用大于散列大小的索引大小(取决于与TEXT开头的距离有多近),请使用散列。

你最好打赌就是试试看。使用代表性数据对两种方法进行归档并查明。

+1

我发现VARCHAR可能是用于索引的更好的列类型,因为与TEXT不同,VARCHAR以内联方式存储并为经常访问的数据提供更好的性能。 http://stackoverflow.com/users/144287/brenton-alker – 2013-01-07 15:05:56

相关问题