2010-06-11 5 views
7

Je pose cette question parce que j'ai besoin de connaître cette limitation que je génère SELECT requête dans mon script PHP et la partie de WHERE dans cette requête est générée à l'intérieur de la boucle.
Précisément, il ressemble à ceciExiste-t-il une limite à la longueur de la requête dans mysql?

$query="SELECT field_names FROM table_name WHERE "; 
$condition="metadata like \"%$uol_metadata_arr[0]%\" "; 
for($i=1; $i<count($uol_metadata_arr); $i++){ 
    $condition.=" OR metadata like \"%$uol_metadata_arr[$i]%\" "; 
} 
$query.=$condition; 
$result=mysql_query($query); 

Alors, voilà pourquoi je dois savoir combien de temps ma chaîne de requête de $ peut être, parce que le tableau $ uol_metadata_arr pourrait contenir de nombreux éléments.

+2

Je crois que votre principale préoccupation devrait être l'utilisation intensive de 'LIKE' (c'est cher), pas le _length_ de la chaîne de requête * en soi * :) – jensgram

+0

remplacer LIKE par quelque chose d'autre? – Bakhtiyor

+1

un index FULLTEXT peut être approprié. –

Répondre

13
  1. (si possible) Utilisez WHERE metadata IN ('value1', 'value2')
  2. Vous devrez peut-être augmenter max_allowed_packet. Il est par défaut à 16MB (côté client, et aussi bas que 1MB côté serveur dans les anciennes versions), et il n'est pas difficile de construire une requête qui se heurte à cette limite (par exemple, importer des données d'ailleurs avec une requête géante INSERT)

LIKE '%string%' est un tueur de performance. Une telle requête ne peut pas utiliser un index sur cette colonne. LIKE 'string%' d'autre part, is indexable

+0

mais où les métadonnées dans ('value1' , 'value2') ne récupère que lorsque les métadonnées sont exactement égales à value1 ou value2. Dans mon cas, j'ai besoin de récupérer des métadonnées similaires, c'est-à-dire que je dois considérer que 'sql' et 'mysql' sont des chaînes égales. – Bakhtiyor

+1

'WHERE metadata IN ('value1', 'value2')' ne fera pas la même chose que ce qu'il mentionne. Il ne cherchera pas à voir si 'value' est dans les métadonnées, mais passera plutôt par chaque valeur de la liste ('value1', 'value2') pour voir si un élément correspond exactement aux métadonnées. Cependant, l'OP voudra certainement vérifier 'max_allowed_packet' comme mentionné si est concerné par des douzaines de clauses where. – Joseph

+0

indexable == sargable –

5

Voir la variable globale max_allowed_packet. Vous aurez besoin d'accéder au fichier my.cnf pour l'ajuster (et devez également l'ajuster sur votre client). Les valeurs par défaut typiques sont soit 1mb ou 16mb ...

Questions connexes