2015-12-21 4 views
1

Пусть у нас есть некоторые поисковые Params, как (автор, жанр, стоимость), и мы должны получить N=15 строкисфинкс испускают (Отклонить) поля поиска

Запрос: select ... where author=a and genre=b and cost=b LIMIT N

Мы должны получить N строки, но мы обнаружили только 2 строки. Затем мы должны исправить паразитную стоимость.

Запрос: select ... where author=a and genre=b LIMIT N

теперь мы имеем 10 < N строк, поэтому мы должны испускать автору

Запрос: select ... where author=a LIMIT N и так далее ..

Как сделать это в правильном пути (я думаю сделать много запросов дорогостоящим,

сделать запрос наподобие: select if (author=a and genre=b and cost=c, 1, 0) as f, if (author=a and genre=b, 1, 0) as s, ... order by f desc, s desc, ... стоит дорого, потому что таблица имеет более 500 000 строк

ответ

2

Вы, вероятно, может сделать его немного более эффективным, с

select ...,author=a + genre=b + cost=c as f from order by d desc 

(если хотите сохранить приоритет может сделать (author=a * 4) + ... и т.д.)

Но в целом, у вас нет MATCH(), поэтому запрос ВСЕГДА будет сканирование полной таблицы. Он должен будет проверять и потенциально сортировать КАЖДУЮ строку в таблице.

Невозможно сделать его действительно эффективным. (Помимо предкомпьютерных значений и хранения их в индексе - могут даже предкоммутировать значения в полях, чтобы воспользоваться полнотекстовым индексом)