我有一个从字符串到整数的映射。要将此映射存储在MySQL数据库中,我创建了下表:
CREATE TABLE map(
Argument TEXT NOT NULL,
Image INTEGER NOT NULL
)
我为参数选择了TEXT类型,因为它的长度是不可预测的,目前最长的记录有2290个字符,平均长度是88个字符。
在我遇到性能问题之后,我尝试在Argument
列上添加索引,但发现我必须指定长度,所以为了避免这种限制,我添加了一个包含哈希值的新整数列(md5或其他)参数列值。
ALTER TABLE map ADD COLUMN ArgumentHash INTEGER;
合并索引
CREATE INDEX argument_index USING HASH ON map(ArgumentHash, Argument(80));
从那时起,性能问题就消失了。我想问一下解决这个问题是否正确。
答案 0 :(得分:3)
我认为没有“正确”的方式,这取决于你使用的是什么。
根据我的经验,不得不/想要选择大型文本列;文本通常是由其他一些键检索的数据(除非以其他方式索引 - 例如全文,Lucene - 但这似乎不是你正在做的事情)
如果你确实需要在大字段上进行精确匹配,那么使用散列可能会更有效,因为它可能会让你保持索引更小。我的猜测是,如果你需要使用大于散列大小的索引大小(取决于TEXT开头与值的差异有多大),请使用散列。
你最好的选择是试试看。用代表性数据描述两种方法并找出答案。