web-dev-qa-db-fra.com

Comment indexez-vous une colonne de texte dans MySQL?

Si je crée une table avec une colonne text

CREATE TABLE foo ( bar text );

Je ne peux pas indexer la colonne 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

Si je HELP CREATE INDEX, Je reçois,

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';

KEY_LENGTH pas seulement mentionné KEY_BLOCK_SIZE, mais si je l'utilise en option, j'obtiens

MariaDB [test]> CREATE INDEX foo_bar_idx ON foo ( bar ) KEY_LENGTH = 5;
ERROR 1911 (HY000): Unknown option 'KEY_LENGTH'
4
Evan Carroll

Dans MySQL, la longueur de clé est ajoutée en tant que modificateur de type et placée entre parenthèses colname(), vous pouvez la fournir à CREATE INDEX comme ça,

CREATE INDEX foo_bar_idx ON foo ( bar(500) );

Cela fait partie de index_col_name, (sauf que ce n'est pas facultatif sur le texte, alors ignorez le [])

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

Vous pouvez également souhaiter un index de recherche en texte intégral (FTS) fournissant à la place la fonctionnalité MATCH

CREATE FULLTEXT INDEX foo_bar_ftsidx ON foo ( bar );

Pour plus d'informations, consultez les MySQL docs on Full Text Search

8
Evan Carroll