views:

83

answers:

2

I am asking this question because I need to know this limitation as I am generating SELECT query in my PHP script and the part of WHERE in this query is generated inside the loop.
Precisely it looks like this

 $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);

So, that's why I need to know how long my $query string can be, because the array *$uol_metadata_arr* could contain many items.

+2  A: 
  1. (if possible) Use WHERE metadata IN ('value1', 'value2')
  2. You may need to increase max_allowed_packet. It defaults to 16MB, and it's not that hard to construct a query that runs up against that limit (e.g., importing data from elsewhere with a giant INSERT query)

LIKE '%string%' is a performance killer. Such a query can't use an index on that column. LIKE 'string%' on the other hand, is indexable

Frank Farmer
but where metadata in ('value1','value2') retrieves only when metadata exactly equal to value1 or value2. In my case I need to retrieve similar metadatas, i.e. I need to consider that 'sql' and 'mysql' are equal strings.
Bakhtiyor
`WHERE metadata IN ('value1', 'value2')` will not do the same thing as he mentions. It will not look to see if 'value' is inside metadata, but rather will go through each value in the list ('value1', 'value2') to see if any item exactly matches metadata. However, the OP will definitely want to check out `max_allowed_packet` as mentioned if is concerned with dozens of where clauses.
Joseph
indexable == sargable
OMG Ponies
A: 

See the max_allowed_packet global variable. You'll need access to the my.cnf file to adjust it (and need to adjust it on your client as well). The typical defaults are either 1mb or 16mb...

ircmaxell