2011-06-02 1 views
1

je les champs de table MySQL suivants:Comment optimiser la requête MySQL pour trouver la sous-chaîne parmi trois champs?

description1, description2, description3: Varchar (500)

value: int

et je souhaite trouver les enregistrements où au moins une de la description comprend la string recherché par l'utilisateur. En ce moment j'utilise la requête suivante. Cela fonctionne, mais il faut environ 1,5 seconde pour retourner les résultats.

SELECT `table`.`value`, 
     `table`.`description1`, 
     `table`.`description2`, 
     `table`.`description3` 
     FROM `table` 
WHERE (`table`.`description1` LIKE '%string%' 
OR `table`.`description2` LIKE '%string%' 
OR `table`.`description3` LIKE '%string%') 
ORDER BY `table`.`value` DESC LIMIT 0 , 9 

Est-il possible d'obtenir des résultats plus rapidement?

(Notez que le champ value est déjà indexé).

Répondre

1

ajouter l'index plein texte et à la place comme utilisation CONTRE

+0

Merci beaucoup. J'ai fait l'index du texte intégral pour les trois champs de description. Mais maintenant avec la requête: "SELECT' table'.'value', 'table'.'description1',' table'.'description2', 'table'.'description3' FROM' table' OERE (MATCH ('description1') AGAINST ('chaîne') OU MATCH ('description2') CONTRE ('chaîne') OU MATCH (' description3') CONTRE ('chaîne')) ORDER BY 'table'.'value' DESC LIMIT 0, 9", Je reçois des résultats complètement différents qu'avec ma requête originale. – tucson

+0

/* avant */\t ALTER TABLE 'table' ADD FULLTEXT ( ' description1', 'description2', ' description3'); /* après */ O MAT MATCH (description1, description2, description1) CONTRE ('chaîne') – cetver

+0

Oui, c'est ce que j'ai fait. Bien que les résultats n'incluent pas toujours la «chaîne» exactement. Si ma chaîne a trois mots, les résultats ont parfois deux des trois mots, etc. Existe-t-il un moyen d'avoir des correspondances exactes de la sous-chaîne? – tucson