2013-04-17 3 views
2

J'avais une très grande table et j'utilise la requête pour obtenir des données de cette table.
Voici la requête.Sélectionnez les données de MySQL de manière plus rapide

<?php 
$input = 'anyword'; 
SELECT * FROM foo WHERE sentence REGEXP '([^[:alnum:]]|^)$input([^[:alnum:]]|$)' 
?> 

Ce puits de travail de recherche, mais ici est le problème qu'il est très slow.I besoin d'une façon plus rapide qui fonctionne comme ci-dessus requête.
Merci ....

+2

Quelques questions: quelle est la largeur de votre table (par exemple, avez-vous besoin de toutes les colonnes retournées via *) et votre table a-t-elle été indexée? Sinon, je m'attendrais à ce qu'une requête utilisant regex de cette manière soit quelque peu intensive. L'opérateur 'LIKE' devrait être plus rapide si vous pouvez l'obtenir pour retourner le même résultat (très probable). – Nathan

+1

@Nathan Sauf si quelque chose a changé récemment, les expressions régulières n'utiliseront pas les recherches d'index, dans le meilleur des cas, vous finirez par un scan d'index au lieu d'un scan de table. En d'autres termes, les index sur les colonnes que vous utilisez ne vont pas accélérer les choses. 'LIKE' peut, comme vous le dites, aider cependant :) –

+0

@JoachimIsaksson Non, il n'a pas changé, vous avez raison à ce sujet étant toujours un scan de table. Cependant, la clause LIKE devrait pouvoir en bénéficier, si elle ne démarre pas avec un caractère générique. – Nathan

Répondre

2

L'exécution d'une expression régulière pour chaque ligne d'une grande table sera lente. Jetez un oeil à full-text searches pour voir comment vous pourriez utiliser un index de texte intégral pour rechercher des mots donnés dans une colonne de texte.

+0

J'utilise innoDB, donc je ne peux pas utiliser la recherche plein texte – Axeem

+0

ok, je peux changer ma base de données en tant que ** MyIsam **. Voici une requête 'SELECT * FROM foo O WH MATCH (phrase) CONTRE ('anyword', EN MODE BOOLEAN) '. Cette requête fonctionne bien. Merci..... – Axeem

Questions connexes