Mysql совпадение ... против простого как "% term%" - PullRequest
5 голосов
/ 24 декабря 2009

Что не так с:

$term = $_POST['search'];

function buildQuery($exploded,$count,$query)
{
   if(count($exploded)>$count) 
   {
      $query.= ' AND column LIKE "%'. $exploded[$count] .'%"';
      return buildQuery($exploded,$count+1,$query);
   }
   return $query;
}

$exploded = explode(' ',$term);
$query = buildQuery($exploded,1,
'SELECT * FROM table WHERE column LIKE "%'. $exploded[0] .'%"');

, а затем запросите базу данных, чтобы получить результаты в определенном порядке, вместо того чтобы использовать сопоставление sql только для myIsam ... против?

Значительно ли это снизит производительность?

Ответы [ 2 ]

6 голосов
/ 24 декабря 2009

Вы можете проверить мою недавнюю презентацию, которую я сделал для университета MySQL:

http://forge.mysql.com/wiki/Practical_Full-Text_Search_in_MySQL

Слайды также здесь:

http://www.slideshare.net/billkarwin/practical-full-text-search-with-my-sql

В моем тесте использование LIKE '%pattern%' было более чем в 300 раз медленнее, чем использование индекса MySQL FULLTEXT.Мои данные испытаний составили 1,5 миллиона сообщений из октябрьского дампа данных StackOverflow.

6 голосов
/ 24 декабря 2009

Разница заключается в алгоритме, который MySQL использует за кулисами для поиска ваших данных. Полнотекстовый поиск также позволяет сортировать по релевантности. При поиске LIKE в большинстве случаев выполняется полное сканирование таблицы, поэтому в зависимости от объема данных могут возникнуть проблемы с производительностью. У полнотекстового движка также могут быть проблемы с производительностью при работе с большими наборами строк.

С другой стороны, одна вещь, которую я бы добавил к этому коду, это что-то, чтобы избежать разнесенных значений. Возможно, звонок на mysql_real_escape_string()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...