Как оптимизировать базу данных для запросов суперструн? - PullRequest
2 голосов
/ 22 октября 2009

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

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

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

Ответы [ 4 ]

1 голос
/ 22 октября 2009

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

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

0 голосов
/ 25 октября 2009

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


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 , добавив новые столбцы в раздел «AS SearchData».

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

0 голосов
/ 23 октября 2009

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

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

0 голосов
/ 22 октября 2009

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

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

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

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

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

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