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