你如何索引 MySQL 中的文本列?

Eva*_*oll 8 mysql mariadb index datatypes

如果我创建一个带有text列的表

CREATE TABLE foo ( bar text );
Run Code Online (Sandbox Code Playgroud)

我无法索引该bar列。

MariaDB [test]> CREATE INDEX foo_bar_idx ON foo ( bar );
ERROR 1170 (42000): BLOB/TEXT column 'bar' used in key specification without a key length
Run Code Online (Sandbox Code Playgroud)

如果我HELP CREATE INDEX,我得到,

Syntax:
CREATE [ONLINE|OFFLINE] [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name
    [index_type]
    ON tbl_name (index_col_name,...)
    [index_option] ...

index_col_name:
    col_name [(length)] [ASC | DESC]

index_type:
    USING {BTREE | HASH}

index_option:
    KEY_BLOCK_SIZE [=] value
  | index_type
  | WITH PARSER parser_name
  | COMMENT 'string';
Run Code Online (Sandbox Code Playgroud)

KEY_LENGTH不仅没有提到KEY_BLOCK_SIZE,但如果我将其用作选项,我会得到

MariaDB [test]> CREATE INDEX foo_bar_idx ON foo ( bar ) KEY_LENGTH = 5;
ERROR 1911 (HY000): Unknown option 'KEY_LENGTH'
Run Code Online (Sandbox Code Playgroud)

Eva*_*oll 12

在 MySQL Key Length 中作为类型修饰符添加并放置在括号中colname(),您可以CREATE INDEX像这样提供它,

CREATE INDEX foo_bar_idx ON foo ( bar(500) );
Run Code Online (Sandbox Code Playgroud)

它是 , 的一部分index_col_name(除了它在文本上不是可选的,所以忽略[]

index_col_name:
  col_name [(length)] [ASC | DESC]
Run Code Online (Sandbox Code Playgroud)

或者,您可能需要全文搜索 (FTS) 索引而不是提供MATCH功能

CREATE FULLTEXT INDEX foo_bar_ftsidx ON foo ( bar );
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅有关全文搜索MySQL 文档

  • 什么是 FOO,什么是 BAR?表名或列名或索引名? (2认同)