【问题标题】:Is it a correct way to index TEXT column of MySQL database?索引MySQL数据库的TEXT列是否正确?
【发布时间】:2010-02-15 23:02:37
【问题描述】:

我有一个从字符串到整数的映射。为了将此地图存储在 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));

从那时起,性能问题就消失了。我想问一下解决这个问题的方法是否正确。

【问题讨论】:

    标签: mysql indexing


    【解决方案1】:

    我认为没有“正确”的方式,这取决于您使用该列的目的。

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

    如果您确实需要对大字段进行精确匹配,那么使用散列可能会更有效,因为它可能会让您的索引更小。我的猜测是,如果您需要使用大于散列大小的索引大小(取决于值通常与 TEXT 开头的距离有多近),请使用散列。

    您最好的选择是尝试并查看。用代表性数据分析这两种方法并找出答案。

    【讨论】:

    • 我发现 VARCHAR 可能是用于索引的更好的列类型,因为 VARCHAR 与 TEXT 不同,它是内联存储的,并且可以为频繁访问的数据提供更好的性能。 stackoverflow.com/users/144287/brenton-alker
    猜你喜欢
    • 1970-01-01
    • 2011-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多