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

Написал свою реализацию алгоритма шинглов для сравнения текстов из файлов. Файлы читаются, разбиваются и загружаются в базу. Затем скрип периодически запускается и проверяет совпадения между файлами, с помощью выборки:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT s1.id, s1.article, s1.file, count(s1.hash) AS count
                   FROM {shingles} s1, {shingles} s2, {files} f1, {files} f2
                 WHERE s1.hash = s2.hash 
                     AND s1.file != {$newfile->id}
                     AND s2.file = {$newfile->id}
                     AND f1.id = s1.file
                     AND f2.id = s2.file
                     AND f1.timecreated < f2.timecreated
             GROUP BY s1.file


(кавычки заменяются на префикс библиотекой БД)

Сперва делается выборка новых файлов, затем они по очереди подставляются в запрос.
Оч долго выполняется... Подскажите, пожалуйста, как можно оптимизировать.
...
Рейтинг: 0 / 0
Оптимизация запроса для алгоритма шинглов
    #38656630
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
М Евгенийкак можно оптимизировать.Индексы правильные построить.
...
Рейтинг: 0 / 0
Оптимизация запроса для алгоритма шинглов
    #38656760
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
М Евгений
Код: plsql
1.
FROM {shingles} s1, {shingles} s2, {files} f1, {files} f2

А у вас точно MySQL ?
...
Рейтинг: 0 / 0
Оптимизация запроса для алгоритма шинглов
    #38656886
М Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft,
М Евгений (кавычки заменяются на префикс библиотекой БД)
...
Рейтинг: 0 / 0
Оптимизация запроса для алгоритма шинглов
    #38656891
М Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AkinaМ Евгенийкак можно оптимизировать.Индексы правильные построить.
Можно детальнее? Это ускорит запрос?
...
Рейтинг: 0 / 0
Оптимизация запроса для алгоритма шинглов
    #38656989
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
группировка не по всем полям.

запрос сильно похож на Cross JOIN
...
Рейтинг: 0 / 0
Оптимизация запроса для алгоритма шинглов
    #38657004
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT s1.id, s1.article, s1.file, count(s1.hash) AS count
FROM {shingles} s1
JOIN {shingles} s2 ON s1.hash = s2.hash 
JOIN {files} f1 ON f1.id = s1.file
JOIN {files} f2 ON f2.id = s2.file
WHERE 
 s1.file != {$newfile->id}
 AND s2.file = {$newfile->id}
 AND f1.timecreated < f2.timecreated
GROUP BY s1.file

индексы на с.хэш, с.файл, ф.ид, и, возможно, ф.таймкриэйтед
ну и про группировку выше уже сказали
...
Рейтинг: 0 / 0
Оптимизация запроса для алгоритма шинглов
    #38657123
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я так понимаю, запрос надо сделать, чтобы мускл правильно это делал

подозреваю что у нас задача, для заданого айди, найти по этим хешам, нету ли более раннего файла на него похожего.

я к тому что выборка
select * from shingles where file = {$newfile->id}
это очень маленькая часть от общего обьёма.

так что по идее, лучше, джоинить не таблицу шинглов(одну из двух) а именно эту выборку

итого получим
(выборка) джоин файлы??? зачем, джоин выборку этой самой нужной строки для нового файла

итого
(выборка из шинглов для данного файла) джоин (выборка из файлов для данного файла)

и тут уже пошли джоины таблиц файлы и шинглы
...
Рейтинг: 0 / 0
Оптимизация запроса для алгоритма шинглов
    #38657495
М Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо всем кто отозвался.

tanglir
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT s1.id, s1.article, s1.file, count(s1.hash) AS count
FROM {shingles} s1
JOIN {shingles} s2 ON s1.hash = s2.hash 
JOIN {files} f1 ON f1.id = s1.file
JOIN {files} f2 ON f2.id = s2.file
WHERE 
 s1.file != {$newfile->id}
 AND s2.file = {$newfile->id}
 AND f1.timecreated < f2.timecreated
GROUP BY s1.file

индексы на с.хэш, с.файл, ф.ид, и, возможно, ф.таймкриэйтед
ну и про группировку выше уже сказали

Ваш этот вариант работает чуток побыстрее, вроде как, но разница очень небольшая. Хотелось бы еще...
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Оптимизация запроса для алгоритма шинглов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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