Подтвердить что ты не робот

Как искать строки, содержащие подстроку?

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


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

4b9b3361

Ответ 1

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

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

Чтобы получить столбцы, которые не совпадают, просто поставьте 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, чтобы увидеть производительность.

Ответ 2

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

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

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

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