2011-03-09 4 views
0

J'ai un tableau avec une liste de mots-clés,MySQL optimisation de la recherche pour une meilleure performance

$arr = array('london','england','football',...);

Le tableau pourrait avoir N e mots-clés.

J'ai besoin d'utiliser ceci sur une requête sql mais je ne veux pas faire trop de répétitions comme ceci.

select * from t1 where title LIKE('%$arr[0]%') OR title LIKE('%$arr[1]%') [...]

juste besoin d'une meilleure solution que chaque mot clé filtre les enregistrements.

thnx

+0

Regardez la recherche en texte intégral de MySQL (http://dev.mysql.com/doc/refman/5.5/fr/fulltext-search.html) –

Répondre

1

Une solution serait de créer une table de consultation qui est rempli avec le rowid et KeywordId chaque fois qu'une ligne est créée ou modifiée.

Ensuite, vous pouvez passer tout le LIKE et obtenir beaucoup plus de performance.

Un déclencheur sur l'insertion et la mise à jour devrait fonctionner mais il en coûtera un peu plus de performance sur l'insertion et la mise à jour.

Vous utilisez simplement

SELECT * FROM t1 WHERE id in (SELECT id FROM lookup WHERE keywordid IN()) 

Et si les mots clés sont nombreux, vous pouvez utiliser une sous requête plus pour obtenir le mot-clé ids ou si moins l'utilisation d'une structure de recherche mis en cache directement dans le code, le dictionnaire ou de même.

0

Je ne suis pas sûr que vous vouliez optimiser la requête réelle lui-même ou les moyens d'insérer des mots clés dans la requête. Si c'est ce dernier, alors ce qui vient à l'esprit est rapidement:

$query = "SELECT * FROM t1 WHERE title"; 

foreach($arr as $keyword) 
{ 
    $stack[] = " LIKE '%$keyword%' "; 
} 

$query .= implode(' OR title ', $stack); 

Si vous voulez éviter analyses complètes de table à base de mots-clés, qui nécessite un autre sujet en lui-même avec plus d'explications à votre fin.

+0

Je préférais une requête mysql plutôt que php, car les boucles php sont faciles :) je voulais juste que ça fonctionne mieux sur mysql :) – Val

0

Selon le type (et le montant) des recherches que vous ferez, vous devrez peut-être envisager d'utiliser autre chose que pure-MySQL pour cela.

MySQL par lui-même est pas tout à fait bien adapté quand il est à la recherche du texte intégral:

  • L'utilisation like '%...%' entraînera de mauvaises performances (balayage toutes les lignes de votre table)
  • Utilisation d'un FULLTEXT index signifie utiliser MyISAM comme moteur de stockage.


Si vous devez faire beaucoup de recherches, il pourrait devenir plus intéressant d'investir dans une solution dédiée à l'indexation/recherche dans un texte, comme Solr, ou Sphinx.

+0

bien que j'essaie de chercher une base de données comme des nuages ​​de mots plus je saisis de mots plus ça rétrécit chercher par exemple la recherche d'une voiture, marque, couleur, et toutes les autres options si cela a du sens comme un système de filtrage – Val