2009-10-21 3 views
2

Итак, у меня есть таблица базы данных в MySQL, в которой есть столбец, содержащий строку. Учитывая целевую строку, я хочу найти все строки, которые имеют подстроку, содержащуюся в целевой, то есть все строки, для которых целевая строка является суперструной для столбца. В настоящий момент я использую запрос по строкам:Как оптимизировать базу данных для запросов суперструн?

SELECT * FROM table WHERE 'my superstring' LIKE CONCAT('%', column, '%') 

Мое беспокойство заключается в том, что это не будет масштабироваться. В настоящее время я делаю некоторые тесты, чтобы понять, является ли это проблемой, но мне интересно, есть ли у кого-нибудь предложения по альтернативному подходу. Я кратко рассмотрел полнотекстовую индексацию MySQL, но также, похоже, предназначен для поиска подстроки в данных, а не для определения наличия данных в данной строке.

+0

Умм, я специально взял термин «суперструна».Я понимаю запрос подстроки как поиск строк, где столбец содержит строку, содержащую целевую строку. – Benno

+0

Можете ли вы сказать, существуют ли какие-либо ограничения «проблемной области» на длину и/или диапазон символов в суперструне? –

+0

... И что может быть слишком длинными подстроками в поле «column». –

ответ

0

Ну, похоже, ответ таков, что вы этого не делаете. Этот тип индексирования, как правило, недоступен, и если вы хотите его в своей базе данных MySQL, вам нужно будет создать свои собственные расширения для MySQL. Альтернатива, которую я преследую, - это сделать индексацию в моем приложении.

Спасибо всем, кто ответил!

1

Вы можете создать временную таблицу с полным текстовым индексом и вставить в нее «мою суперструну». Затем вы можете использовать синтаксис полного соответствия MySQL в запросе соединения с вашей постоянной таблицей. Вы по-прежнему будете выполнять полное сканирование таблицы на своей постоянной таблице, потому что вы будете проверять соответствие каждой отдельной строке (что вы хотите, правильно?). Но по крайней мере «моя суперструна» будет проиндексирована, поэтому она, скорее всего, будет работать лучше, чем у вас сейчас.

В качестве альтернативы вы можете просто выбрать column от table и выполнить матч на высоком уровне. В зависимости от того, сколько строк находится в table, этот подход может иметь больше смысла. Разгрузка тяжелых задач на клиентский сервер (веб-сервер) часто может быть победой, поскольку она снижает нагрузку на сервер базы данных.

+0

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

0

Если ваши суперструны являются URL-адресами, и вы хотите найти подстроки в них, было бы полезно узнать, могут ли ваши подстроки быть привязаны к точкам.

Например, у вас есть суперструн:

www.mafia.gov.ru www.mymafia.gov.ru www.lobbies.whitehouse.gov

Если ваши правила содержат «мафию» и вы хотите, чтобы первые 2 соответствовали, то то, что я скажу, не применяется.

Кроме того, вы можете анализировать свои URL-адреса в таких вещах, как: ['www', 'mafia', 'gov', 'ru' ] Затем вам будет намного проще искать каждый элемент в таблице.

+0

Я могу сделать это в случае с именем хоста, но он менее полезен для всего URL-адреса. Хорошая идея. – Benno

0

Я создал поисковое решение, используя представления, которые должны были быть достаточно прочными, чтобы расти с потребностями клиентов. Для примера:

 

CREATE TABLE tblMyData 
(
MyId bigint identity(1,1), 
Col01 varchar(50), 
Col02 varchar(50), 
Col03 varchar(50) 
) 

CREATE VIEW viewMySearchData 
as 
SELECT 
MyId, 
ISNULL(Col01,'') + ' ' + 
ISNULL(Col02,'') + ' ' + 
ISNULL(Col03,'') + ' ' AS SearchData 
FROM tblMyData 

SELECT 
t1.MyId, 
t1.Col01, 
t1.Col02, 
t1.Col03 
FROM tblMyData t1 
INNER JOIN viewMySearchData t2 
ON t1.MyId = t2.MyId 
WHERE t2.SearchData like '%search string%' 

 

Если они затем решили добавить столбцы tblMyData, и они хотят, чтобы эти столбцы для поиска затем изменить viewMysearchData путем добавления нового colums в раздел «AS SearchData».

Если они решили, что в поиске есть два столбца, просто измените viewMySearchData, удалив ненужные столбцы из раздела «AS SearchData».

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