2011-01-07 5 views
1

J'ai une requête lente sur ma table. Il a une clause where telle que:MySQL MyISAM indexer une colonne de texte

where supplier= 'Microsoft' 

Le type de colonne est texte. Dans phpmyadmin j'ai cherché à voir si je pouvais ajouter un index à la table mais l'option est désactivée. Cela signifie-t-il que vous ne pouvez pas indexer une colonne de texte? Cela signifie-t-il que chaque requête de mise à jour comme celle-ci effectue une analyse de table complète? Alors, la meilleure chose à faire est de séparer la colonne dans sa propre table et de placer un identifiant dans la table actuelle, puis de placer un index dessus? Cela pourrait-il accélérer la requête?

+0

Vous êtes le profil d'utilisation sur SE est tout à fait exceptionnel: votes faibles, mais un grand nombre de vues. À votre santé. –

Répondre

0

Vous devez ajouter une longueur de préfixe à l'index. Jetez un oeil à Column Indexes docs

qui suit crée un index sur les 50 premiers octets de champ fournisseur:

mysql> create index supplier_ix on t(supplier(50)); 
Query OK, 0 rows affected (0.03 sec) 
Records: 0 Duplicates: 0 Warnings: 0 

Mais peut-être vous devriez repenser le type de données du fournisseur? A en juger par le nom, il ne ressemble pas à un champ de texte typique ...

+0

Cela empêcherait-il une analyse de table complète? – Sally

+0

Si je dis oui, repenserais-tu encore ton choix de type de données? :) – Ronnis

0

Vous devriez faire un contrôle sur

select max(length(supplier)) from the_table; 

Si la longueur est inférieure à 255, vous pouvez (et vous devriez) convertissez-le en varchar (255) et créez un index

Le choix d'un type de données correct est plus important.

Si la longueur est longue, construit un index sur la longueur limitée aidera.

+0

Cela me renvoie 14. Dans "general", une colonne varchar fonctionnera-t-elle mieux qu'une colonne de texte (même si la colonne de texte est indexée?). – Sally

+0

En général, il le fera. Et vous pouvez utiliser VARCHAR jusqu'à 65536 caractères. – Mchl

+0

... 65536 caractères dans toutes les colonnes. Cela signifie que si vous avez deux colonnes, chacune peut mesurer environ 32765 octets. (Notez que UTF utilise 3 octets) – shantanuo

0

Ai-je bien compris? C'est une colonne TEXT? Comme dans le type qui correspond à BLOB? Puis-je vous conseiller d'envisager un VARCHAR pour cette colonne?

+0

Pouvez-vous toujours faire une recherche de texte intégral sur une colonne varchar? – Sally

+0

Oui, vous pouvez. La question est de savoir si vous devriez utiliser la recherche en texte intégral pour une colonne supposée contenir le nom d'un fournisseur. La condition 'where supplier = 'Microsoft'' n'utilise pas l'index de texte intégral de toute façon. – Mchl

Questions connexes