Как искать строки, содержащие подстроку? - PullRequest
35 голосов
/ 08 ноября 2010

Если я сохраняю HTML TEXTAREA в моей базе данных ODBC каждый раз, когда пользователь отправляет форму, что такое оператор SELECT для извлечения 1) всех строк, которые содержат данную подстроку 2) всех строк, которые не (и поиск чувствителен к регистру?)


Редактировать: если LIKE "%SUBSTRING%" будет медленным, было бы лучше получить все и разобраться в PHP?

Ответы [ 2 ]

37 голосов
/ 08 ноября 2010

Ну, вы всегда можете попробовать WHERE textcolumn LIKE "%SUBSTRING%" - но это гарантированно будет довольно медленно, поскольку ваш запрос не может выполнить индексное совпадение, потому что вы ищете символы слева.

Этозависит от типа поля - текстовая область обычно не сохраняется как VARCHAR, а скорее как (своего рода) поле TEXT, поэтому вы можете использовать оператор MATCH AGAINST .

Toчтобы получить столбцы, которые не совпадают, просто поставьте NOT перед следующим: WHERE textcolumn NOT LIKE "%SUBSTRING%".

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

Обновленный ответ для отражения обновления вопроса:

Я говорю, что выполнение WHERE field LIKE "%value%" выполняется медленнее, чем WHERE field LIKE "value%", если поле столбца содержитиндекс, но это все еще значительно быстрее, чем получение всех значений и фильтра вашего приложения.Оба сценария:

1 / Если вы сделаете SELECT field FROM table WHERE field LIKE "%value%", MySQL будет сканировать всю таблицу и отправлять только поля, содержащие «значение».

2 / Если вы делаете SELECT field FROM table итогда ваше приложение (в вашем случае PHP) отфильтровывает только строки с «значением», MySQL также просканирует всю таблицу, но отправит все поля в PHP, который затем должен выполнить дополнительную работу.Это намного медленнее, чем в случае № 1.

Решение: Пожалуйста, используйте предложение WHERE и используйте EXPLAIN, чтобы увидеть производительность.

5 голосов
/ 08 ноября 2010

Информация о полнотекстовом поиске MySQL.Это ограничено таблицами MyISAM, поэтому может не подойти, если вы хотите использовать другой тип таблицы.

http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html

Даже если WHERE textcolumn LIKE "%SUBSTRING%" будет медленным, я думаю, этоВероятно, лучше позволить базе данных обрабатывать ее, а не PHP.Если можно ограничить поиск по некоторым другим критериям (диапазон дат, пользователь и т. Д.), Тогда вы можете обнаружить, что поиск по подстроке в порядке (ish).

Если вы ищете целые слова, вы можете вынуть все отдельные слова в отдельную таблицу и использовать это для ограничения поиска подстроки.(Таким образом, при поиске «моей строки поиска» вы ищете самое длинное слово «поиск», выполняйте поиск только по подстроке в записях, содержащих слово «поиск»)

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