2012-11-25 3 views
2

У меня есть поиск, который ищет совпадение через несколько столбцов в нескольких таблицах. Проблема в том, что я использую «ИЛИ», но это не работает, если пользователь выполняет поиск по нескольким столбцам.MySQL ищет несколько столбцов для соответствия

Вот мой запрос:

SELECT clients.clientName, 
     projects.Client_ID, 
     projects.projectNumber, 
     projects.projectName, 
     projects.projectManager, 
     projects.expectedDate, 
     projects.address, 
     projects.CreationDate, 
     projects.custom1, 
     projects.custom2, 
     projects.custom3, 
     projects.custom4, 
     projects.custom5, 
     projects.custom6, 
     projects.custom7, 
     projects.custom8, 
     projects.custom9, 
     projects.Status_ID, 
     statuses.status 
FROM projects 
JOIN clients ON projects.Client_ID = clients.Client_ID 
JOIN statuses ON projects.Status_ID = statuses.Status_ID 
WHERE clientName LIKE '%$keyword%' 
    OR projectNumber LIKE '%$keyword%' 
    OR projectName LIKE '%$keyword%' 
    OR address LIKE '%$keyword%' 
    OR area LIKE '%$keyword%' 
    OR status LIKE '%$keyword%' 
    OR custom1 LIKE '%$keyword%' 
    OR custom2 LIKE '%$keyword%' 
    OR custom3 LIKE '%$keyword%' 
    OR custom4 LIKE '%$keyword%' 
    OR custom5 LIKE '%$keyword%' 
    OR custom6 LIKE '%$keyword%' 
    OR custom7 LIKE '%$keyword%' 
    OR custom8 LIKE '%$keyword%' 
    OR custom9 LIKE '%$keyword%'; 

Если же пользователь: статус и клиент --my запрос не возвращает никаких результатов.

Кроме того, меня беспокоит скорость этого запроса с большим количеством данных.

+0

Вы просто должны переписать запрос, основанный на поиске, изменении или в и, и только включать поля, которые вы выполняете, не каждый раз каждый раз. –

+0

Также при запросе нескольких таблиц не делайте предположения db использовать полное имя столбца в '' WHERE', например 'projects.custom9' – prodigitalson

+0

Да, вы должны беспокоиться о скорости. База данных будет проверять каждую строку в базе данных каждый раз при поиске, потому что вы не можете использовать какие-либо индексы. –

ответ

3

Вы правы, тип запроса, который вы используете, заставит сканирование таблицы, и оно не может быть проиндексировано. Это по-прежнему верно, даже если вы просматриваете только один столбец с LIKE '%$keyword%'

Единственный эффективный способ полнотекстового поиска - это специальная технология полнотекстового индексирования. MySQL имеет встроенный, но только для таблиц MyISAM (полнотекстовые индексы будут поддерживаться в InnoDB в MySQL 5.6).

Вы должны прочитать мою презентацию: Full Text Search Throwdown для сравнения различных решений. Из теста я понял, что с использованием LIKE работает в сотни или тысячи раз медленнее, чем с использованием любого типа индексации текста. Насколько медленнее во многом зависит размер вашего стола.


Re комментарий от @Dagon:

Первоначально я сделал это представление в 2008 году, но я обновил его и снова побежал все мои испытания в апреле 2012 года разницы с моих 2008 презентаций были незначительным.

Любое индексирующее решение по-прежнему на порядок превосходит дорогостоящие сканированные таблицы с LIKE. Чем больше ваш стол, тем больше польза от индексации. Этот принцип не изменится.

+1

результаты сильно изменились за 3 года (просто любопытно)? –

+0

спасибо за обновление. –

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