mysql - 索引 MySQL 数据库的 TEXT 列是正确的方法吗?

标签 mysql indexing

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

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

最佳答案

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

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

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

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

关于mysql - 索引 MySQL 数据库的 TEXT 列是正确的方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2269557/

相关文章:

具有复合索引和持久列的 MySQL 查询优化

sql-server - Sql Server : uniqueidentifier plus integer compound PK . .. 使用什么类型的索引?

c# - 在 C# 属性中实现索引

java - 线程中的异常 "main"java.lang.StringIndexOutOfBoundsException : String index out of range: 1

sql - 在 mysql 或 postgres 中,IN (1,2,n) 语句的大小是否有限制?

mysql - 按最后 2 个字符对字符串列表进行排序

c# - Entity Framework 和 MySQL - 在没有 key 长度的 key 中使用 BLOB/TEXT 列

php - 如何并行读取多个文件?

search - 在 Web 项目中使用 SOLR 的最佳方法是什么?

python - 由于编码而比较哈希值时出错