Det kommer skam an på hvad du vil bruge dit varchar felt til. I sig selv er det ikke en dårlig idé at sætte et index på et varchar felt.
Ud fra dit spørgsmål har jeg dog den fået den grimme tanke, at du mener et stort felt hvor du vil putte alskens ustrukturerede informationer ind i. A definite No, No!
Det er altid en dårlig idé at opbygge sin database med store felter, som indeholder mange forskellige oplysninger, som man så er nødt til at søge på ved at bruge en LIKE '%etellerandet%'. Så vidt det overhovedet er muligt bør man af performancehensyn bruge et felt pr. oplysning, og så tage med i købet, at man er nødt til at opbygge en større forespørgsel. Det betyder ikke nødvendigvis, at man helt skal undgå LIKE funktionen, for hvis man kan nøjes med at bruge LIKE 'etellerandet%', så kan databasen stadig udnytte et index.
Med andre ord, undgå så vidt muligt situationen, hvor du putter en masse søgeord i et stort felt, med f.eks. komma imellem.
Opbyg hellere en selvstændig tabel med søgeordene, som du så joiner med den tabel du søger i:
SELECT * FROM oplysningstabel WHERE søgefelt LIKE '%søgekriterie1%' or søgefelt LIKE '%søgekriterie2%'
Ovenstående er et eksempel på dårligt opbygget database som ikke vil performe særligt godt, da den ikke kan udnytte indexer.
SELECT oplysningstabel.* FROM oplysningstabel INNER JOIN søgeordstabel ON oplysningstabel.linkfelt = søgeordstabel.linkfelt
WHERE søgeordstabel.søgefelt = 'søgekriterie1' or søgeordstabel.søgefelt = 'søgekriterie2'
Ovenstående er et eksempel på en databaseopbygning som vil performe godt og vil have stor gavn af et index.
Med en sådan opbygning kan du endog søge på en del af søgeordet og stadig have gavn af indexet (bare du holder dig til at søge på starten af søgeordet), f.eks.:
SELECT oplysningstabel.* FROM oplysningstabel INNER JOIN søgeordstabel ON oplysningstabel.linkfelt = søgeordstabel.linkfelt
WHERE søgeordstabel.søgefelt LIKE 'søgekriterie1%' or søgeordstabel.søgefelt LIKE 'søgekriterie2%'
ref.: MySQL Manualen, kapitel 7.4.5 How MySQL Uses Indexes
A B-tree index can be used for column comparisons in expressions that use the =, >, >=, <, <=, or BETWEEN operators. The index also can be used for LIKE comparisons if the argument to LIKE is a constant string that doesn't start with a wildcard character. For example, the following SELECT statements use indexes:
SELECT * FROM tbl_name WHERE key_col LIKE 'Patrick%';
SELECT * FROM tbl_name WHERE key_col LIKE 'Pat%_ck%';
In the first statement, only rows with 'Patrick' <= key_col < 'Patricl' are considered. In the second statement, only rows with 'Pat' <= key_col < 'Pau' are considered.
The following SELECT statements do not use indexes:
SELECT * FROM tbl_name WHERE key_col LIKE '%Patrick%';
SELECT * FROM tbl_name WHERE key_col LIKE other_col;
In the first statement, the LIKE value begins with a wildcard character. In the second statement, the LIKE value is not a constant.
MySQL 4.0 and up performs an additional LIKE optimization. If you use ... LIKE '%string%' and string is longer than three characters, MySQL uses the Turbo Boyer-Moore algorithm to initialize the pattern for the string and then use this pattern to perform the search quicker.
Alternativt kan du, hvis du insisterer på et stort felt med ustrukturerede data, kigge på full-text search, som findes i nyere versioner af MySQL:
http://dev.mysql.com/doc/mysql/en/fulltext-search.htmlPerformancemæssigt vil det nok ligge mellem de to ovenstående hvor man benytter sig af alm. SQL syntax og tabeller.