powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / поиск в базе по подстроке
9 сообщений из 9, страница 1 из 1
поиск в базе по подстроке
    #38689917
Viacheslav_mihalich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток,

для поиска всех записей в БД по полю "NAME", где присутствует подстрока 'михаил' использую запрос:

Код: plsql
1.
select "DOCTORS"."ID" as id, "DOCTORS"."NAME" as name from "DOCTORS" WHERE "DOCTORS"."NAME" ILIKE '%михаил%';



Вопрос: какая есть альтернатива like, запрос с которым при больших таблицах будет медленным?
Использовать регулярные выражения?
Например так тоже работает:

Код: plsql
1.
select "DOCTORS"."ID" as id, "DOCTORS"."NAME" as name from  "DOCTORS" where  "DOCTORS"."NAME" ~*  '.михаил.';



Вопрос только, что быстрее и надежнее?
...
Рейтинг: 0 / 0
поиск в базе по подстроке
    #38689928
Alexius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Viacheslav_mihalich,

обычные индексы не используются, если нужно искать по подстроке внутри строки или по регекспу. быстрее должно быть когда используется специальный индекс по триграммам из расширения pg_trgm .
...
Рейтинг: 0 / 0
поиск в базе по подстроке
    #38690474
Ivan Durak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть gist индекс
...
Рейтинг: 0 / 0
поиск в базе по подстроке
    #38691208
Viacheslav_mihalich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо,

создал индекс
Код: plsql
1.
CREATE INDEX "TRGM_DOCTOR_NAME" ON "DOCTORS" USING GIST ("NAME" gist_trgm_ops);



Проверил на производительность 3 варианта поиска:

1.
Код: plsql
1.
SELECT "NAME", similarity("NAME", 'михаил') AS sml FROM "DOCTORS" WHERE "NAME" % 'михаил' ORDER BY sml DESC, "NAME";



план выполнения:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
"QUERY PLAN"
"Sort  (cost=8.28..8.29 rows=1 width=48) (actual time=0.125..0.132 rows=5 loops=1)"
"  Sort Key: (similarity((""NAME"")::text, 'михаил'::text)), ""NAME"""
"  Sort Method: quicksort  Memory: 17kB"
"  ->  Index Scan using ""TRGM_DOCTOR_NAME"" on ""DOCTORS""  (cost=0.00..8.27 rows=1 width=48) (actual time=0.045..0.100 rows=5 loops=1)"
"        Index Cond: ((""NAME"")::text % 'михаил'::text)"
"Total runtime: 0.163 ms"



2.
Код: plsql
1.
select "DOCTORS"."ID" as id, "DOCTORS"."NAME" as name from "DOCTORS" WHERE "DOCTORS"."NAME" ILIKE '%михаил%';



план выполнения:
Код: plsql
1.
2.
3.
4.
5.
"QUERY PLAN"
"Seq Scan on ""DOCTORS""  (cost=0.00..11.28 rows=5 width=56) (actual time=0.029..0.275 rows=6 loops=1)"
"  Filter: ((""NAME"")::text ~~* '%михаил%'::text)"
"  Rows Removed by Filter: 96"
"Total runtime: 0.302 ms"



3.
Код: plsql
1.
select "DOCTORS"."ID" as id, "DOCTORS"."NAME" as name from "DOCTORS" where "DOCTORS"."NAME" ~* '.*михаил.*';



план выполнения:
Код: plsql
1.
2.
3.
4.
5.
"QUERY PLAN"
"Seq Scan on ""DOCTORS""  (cost=0.00..11.28 rows=5 width=56) (actual time=0.026..0.171 rows=6 loops=1)"
"  Filter: ((""NAME"")::text ~* '.*михаил.*'::text)"
"  Rows Removed by Filter: 96"
"Total runtime: 0.198 ms"



Видно, что 3-й способ не на много медленнее, чем через
gist индекс.
Запрос с LIKE, как и ожидалось, значительно медленнее. Но это еще пока данных в БД мало. При больших данных разница во времени скорей всего почувствуется еще сильней.
...
Рейтинг: 0 / 0
поиск в базе по подстроке
    #38691270
Ы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ы
Гость
Viacheslav_mihalich,

уберите сортировку в первом варианте: в других ее нет, а тут на нее уходит большая часть времени.
...
Рейтинг: 0 / 0
поиск в базе по подстроке
    #38691286
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Viacheslav_mihalich,

тестируйте на гораздо большем объеме данных. на ваших ста строках разница почти не видна. вот если не в два раза, а на порядки, это сразу будет заметно.
...
Рейтинг: 0 / 0
поиск в базе по подстроке
    #38691287
Гость_0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Viacheslav_mihalich,

время всех трёх запросов меньше одной миллисекунды, это даже в сумме меньше чем квант времени в мультизадачной операционной системе, такой например как windows. Ваша ОС квант времени пропустит и время запроса в десять раз прыгнет, какой смысл тестировать на таком малом количестве данных?
...
Рейтинг: 0 / 0
поиск в базе по подстроке
    #38691300
V&N
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
V&N
Гость
Гость_0Viacheslav_mihalich,

время всех трёх запросов меньше одной миллисекунды, это даже в сумме меньше чем квант времени в мультизадачной операционной системе, такой например как windows . Ваша ОС квант времени пропустит и время запроса в десять раз прыгнет, какой смысл тестировать на таком малом количестве данных?плин, зря итаниумы заморозили ....
...
Рейтинг: 0 / 0
поиск в базе по подстроке
    #38691460
Ivan Durak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Viacheslav_mihalichСпасибо,

Видно, что 3-й способ не на много медленнее, чем через
gist индекс.
Запрос с LIKE, как и ожидалось, значительно медленнее. Но это еще пока данных в БД мало. При больших данных разница во времени скорей всего почувствуется еще сильней.
видно что 2-й и 3-й способы одинаковые, фул скан с фильтром.
1-й юзает индекс.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / поиск в базе по подстроке
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]