2010-06-11 3 views
7

Я задаю этот вопрос, потому что мне нужно знать это ограничение, поскольку я генерирую запрос SELECT в моем скрипте PHP и в части WHERE в этом запросе генерируется внутри цикла.
Именно это выглядит такЕсть ли ограничение на длину запроса в 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); 

Итак, вот почему я должен знать, как долго моя $ запроса строка может быть, потому что массив $ uol_metadata_arr может содержать много элементов.

+2

Я считаю, что ваша главная забота должна заключаться в тяжелом использовании 'LIKE' (это дорого), а не _length_ строки запроса * per se * :) – jensgram

+0

Любые предложения для замените LIKE на что-то еще? – Bakhtiyor

+1

Индекс FULLTEXT может быть уместным. –

ответ

13
  1. (если это возможно) Используйте WHERE metadata IN ('value1', 'value2')
  2. Вы, возможно, потребуется увеличить max_allowed_packet. По умолчанию он равен 16 МБ (на стороне клиента и с 1 МБ на стороне сервера в более старых версиях), и не так сложно построить запрос, который соответствует этому пределу (например, импорт данных из другого источника с помощью гигантского запроса INSERT)

LIKE '%string%' является производителем убийц. Такой запрос не может использовать индекс в этом столбце. LIKE 'string%', с другой стороны, is indexable

+0

, но где метаданные в ('value1' , 'value2') извлекается только тогда, когда метаданные в точности равны value1 или value2. В моем случае мне нужно получить похожие метаданные, т. Е. Мне нужно учитывать, что «sql» и «mysql» равны. – Bakhtiyor

+1

'ГДЕ метаданные IN ('value1', 'value2')' не будут делать то же самое, что он упоминает. Он не будет смотреть, находится ли «значение» внутри метаданных, а будет проходить через каждое значение в списке («value1», «value2»), чтобы увидеть, соответствует ли какой-либо элемент метаданным. Тем не менее, OP, безусловно, захочет проверить «max_allowed_packet», как упоминалось, если речь идет о десятках предложений where. – Joseph

+0

indexable == sargable –

5

См. Глобальную переменную max_allowed_packet. Вам потребуется доступ к файлу my.cnf, чтобы настроить его (и его нужно настроить и на вашем клиенте). Типичными значениями по умолчанию являются либо 1mb, либо 16mb ...

Смежные вопросы