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é).
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
/* avant */\t ALTER TABLE 'table' ADD FULLTEXT ( ' description1', 'description2', ' description3'); /* après */ O MAT MATCH (description1, description2, description1) CONTRE ('chaîne') – cetver
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