2013-10-08 2 views
0

У меня есть функция, которая превращает эту строкуделает наличие mutliple ИЛИ Cluses замедлить запрос

[games]|[nexis core]|[core]|[lemure lemure]|[chrome tower dlc] 

в это где положение

WHERE 
(
    main.tags LIKE '%[games]%' OR 
    main.tags LIKE '%[nexis core]%' OR 
    main.tags LIKE '%[core]%' OR 
    main.tags LIKE '%[lemure lemure]%' OR 
    main.tags LIKE '%[chrome tower dlc]%' 
) 

в таблице это делает поиск в, запись будет имеет tags поле вроде следующего

[boss]|[lemure lemure]|[astra]|[divine]|[kamidori]|[3rd party]|[razil]|[core] 

так, когда выше, где работает пункт, он может море RCH в tags полей и порядок тегов не будет иметь никакого влияния на поиске

причины, почему я упаковываю каждый тег в [] и сделать LIKE Cluse с ним включен, если кто-то ищет тег party они могут получить [3rd party] [party members] [nunnally's battle party] [battle party reality marble] которые все это совершенно разные вещи, как [3rd party] используется для описания сражения которой третья группа, которая участвует не в союзе с игроком партии или вражеской партии, а [battle party reality marble] используется для описания способности

я отделить каждую метку с | так что я могу взорвать строку в PHP, когда я вытащил ее из базы данных и вывел каждый тег на страницу, simi lar, чтобы предложить теги, когда здесь задан вопрос

сейчас, в то время как я могу наложить ограничение на количество тегов, которые могут использовать в поиске, например, как этот сайт ограничивает количество тегов, используемых в вопросе, до 5 я хочу, чтобы попытаться избежать этого, если возможно, WHERE пункт я генерировать может иметь технически бесконечные OR потому, что того, как она генерирует

я задаюсь вопросом, может ли подготовленный оператор в MySQLi замедлить, если я использую слишком много OR в запрос

+1

Что будет замедлять ваш запрос, не может использовать какие-либо индексы из-за конструкций 'LIKE '% ...%'. Вы действительно должны переключиться на использование индексной системы FULLTEXT, которая предназначена для таких запросов. То, что замедляет ваш запрос, - это использование неправильного дизайна и помещение всех этих тегов в поле SINGLE в записи SINGLE. Вы должны нормализовать свой дизайн и разделить их на детскую таблицу. –

+1

Конечно, в конце концов, он начнет замедляться, когда вы добавите дополнительные предложения, основная стоимость исполнения - это предложения LIKE, а не только OR. FULLTEXT было бы лучше, и если у вас будет более пары миллионов строк, вам нужно будет использовать что-то вроде Apache SOLR –

ответ

6

Удар воздействия не из-за комбинации OR, а из-за LIKE '%search', который не может использовать индекс.

И действительно, ваша база данных плохо нормализована - и из-за этого сложнее получить то, что вам нужно, и требуется больше производительности, чем необходимо.

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