Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: что можно использовать вместо LIKE (искать похожие слова-теги)
Покинул форум
Сообщений всего: 69
Дата рег-ции: Май 2018
Помог: 2 раз(а)
Собственно есть таблица, в ней ячейка keywords с ключевыми словами-тегами, перечисленными через запятую для каждой новой строчки-новости.
Пример таблицы (урезанный):
WHERE t.keywords LIKE '%мама%' ORDER BY t.added DESC LIMIT 0,25
Запрос выходит проблемный очень. Грузит сильно мускуль, в таблице много строк - около 1500 и будет еще больше со временем. Индексы есть, но хочется убрать этот костыль и как-то по другому поиск организовать.
Есть мысль о внешней (другой) таблице, где будут все теги и искать там, получая цифру-ID и по ней уже искать в таблице movies. Но это опять вопрос - как именно?
Кто что подскажет?
Заранее спасибо.
don.bidon
Отправлено: 13 Июня, 2021 - 22:39:23
Гость
Покинул форум
Сообщений всего: 79
Дата рег-ции: Март 2019
Select id from torrents where keywords like '%$search%'
Потом подключать к уже найденному результату все остальные обвесы. Вот думаю как это реализовать с подгрузкой доп.запросов.
Я так думаю что в этом варианте поиска только ид через лайк тега будет индекс пользоваться и не нагружаться сильно мускуль поиском по тысячам строкам.
Есть идеи как это провернуть?
don.bidon
Отправлено: 14 Июня, 2021 - 08:32:29
Гость
Покинул форум
Сообщений всего: 79
Дата рег-ции: Март 2019
Помог: 2 раз(а)
если ничего не путаю, при LIKE индексуй-не индексуй, всё равно без индекса буде
а по поводу запросов, вначале запроса на выборку DESCRIBE подставляем и смотрим, что происходит, какие индексы используются и прочее.
> Есть идеи как это провернуть?
Какой бюджет?
Lolya
Отправлено: 14 Июня, 2021 - 09:21:22
Гость
Покинул форум
Сообщений всего: 69
Дата рег-ции: Май 2018
Помог: 2 раз(а)
don.bidon пишет:
если ничего не путаю, при LIKE индексуй-не индексуй, всё равно без индекса буде
а по поводу запросов, вначале запроса на выборку DESCRIBE подставляем и смотрим, что происходит, какие индексы используются и прочее.
> Есть идеи как это провернуть?
Какой бюджет?
Нет, индекс будет использоваться для поля тегов
>Бюджет: €0.00000000000
Я не на продажу, видите же что на ГИТ выложено обновлениями бесплатно. Есть конечно свои моды, которые не будут в свободном доступе, но именно этот фришный.
Итак, идея назрела, чуток обмозговала. И.... Ерунда получилась. Показываю по вариантам.
_--------
Вариант 1.
Запрос:
Select id from torrents where keywords like '%$search%'
Получаем ид, потом в торрент-табле.пхп подключать через него весь основной обвес старого запроса в цикле. Но это выходит не 1 запрос на страницу с 25 фильмами, а 1+25=26. Да, они будут быстрыми по исполнению, но 25!!! Короче этот вариант попа*.
Вариант 2.
Получать опять же через запрос ид, но впихнуть в array(); - список ид, которые потом скормить второму запросу, который будет уже цикличным и выдавать результат по 25 фильмов на страницу с всего 2 запросами...
Как-то так:
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
Lolya пишет:
Нет, индекс будет использоваться для поля тегов
don.bidon совершенно прав. Речь совершенно определённо о mysql, значит совершенно рядовой btree и никаких триграмных индексов. btree не может эффективно ускорять like '%const%' запросы.
Планировщик в принципе может сказать, что пойдёт в индекс - но лишь чтобы прочитать полностью весь индекс потому что он чуть компактнее чем вся таблица.
Lolya пишет:
Получаем ид, потом в торрент-табле.пхп подключать через него весь основной обвес старого запроса в цикле. Но это выходит не 1 запрос на страницу с 25 фильмами, а 1+25=26. Да, они будут быстрыми по исполнению
Не будут. Даже на смешных объёмах данных в сотни тысяч строк.
Lolya пишет:
перечисленными через запятую для каждой новой строчки-новости
Сначала приведите в нормальную форму.
Затем уже можно думать, какую дальнейшую задачу необходимо решать. Поиск по тегам? В нормальной форме элементарен.
Похожие слова как подсказка ввода? Это like 'const%' обычно, чудесно работающие по btree т.к. префиксный поиск.
Похожие теги относительно того тега что сейчас смотрит пользователь? Отдельная таблица, из веба только читаемая, а заполняемая асинхронно в фоне (крон, брокер очередей, etc)
К примерно половине индексов показанных в начале темы есть вопросы "зачем оно вам понадобилось".
----- PostgreSQL DBA
Lolya
Отправлено: 15 Июня, 2021 - 11:20:11
Гость
Покинул форум
Сообщений всего: 69
Дата рег-ции: Май 2018
Помог: 2 раз(а)
Индексы это старые, уже давно другие, это я пример с бекапа показала старого.
...
На выходных сделаю что хотела, результат напишу.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.