我正在尝试索引mysql innodb-table中的文本字段,看起来哈希索引是这样的:
CREATE INDEX teksti_index USING HASH ON maili_teksti(teksti(100));
那么,这是否意味着mysql占用该字段的前100个字符并计算哈希值(然后对哈希值进行索引)。如果我将数字100更改为200,那么索引的大小是否相同?
而且......如果我想优化这种命令,这是一种正确的方法:
SELECT count(*) from teksti where teksti='random text';
答案 0 :(得分:3)
在处理CHAR
,VARCHAR
和TEXT
列时(正如您处理TEXT
),创建索引时分配的前缀长度将创建使用前X个字符的哈希 - 正是您的想法(source)。
当处理标准索引时,更改索引数据的大小也应该改变索引的大小(即 - 添加字符应该增加索引;删除应该减少)。在处理HASH索引时,这是一个猜测,因为我找不到关于它的具体文档,我会认为它不会增加(至少,不是很多)由于性质散列算法。
HASH索引仅适用于=
和<=>
运算符,因此teksti='random text'
的样本用法非常适合此类索引(source)。如果您需要使用其他运算符,例如LIKE
,<
或>
运算符,则可能需要考虑切换到B-TREE
索引。
作为完整的替代选项,您可以查看FULLTEXT
索引。这提供了大量的匹配功能,虽然它相当强大并且可能太多。 Full-Text Search Functions
页面上的文档指出FULLTEXT
只能与MyISAM一起使用,但,Section 14.2.4.12.3
文档页面上的FULLTEXT
涵盖{{ 1}}与InnoDB的索引 - 所以,这可能是也可能不是= P。