Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Оптимизация запроса для алгоритма шинглов / 9 сообщений из 9, страница 1 из 1
30.05.2014, 07:38:25
    #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
30.05.2014, 08:53:37
    #38656630
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса для алгоритма шинглов
М Евгенийкак можно оптимизировать.Индексы правильные построить.
...
Рейтинг: 0 / 0
30.05.2014, 11:00:07
    #38656760
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса для алгоритма шинглов
М Евгений
Код: plsql
1.
FROM {shingles} s1, {shingles} s2, {files} f1, {files} f2

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

запрос сильно похож на Cross JOIN
...
Рейтинг: 0 / 0
30.05.2014, 13:46:53
    #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
30.05.2014, 15:02:19
    #38657123
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса для алгоритма шинглов
я так понимаю, запрос надо сделать, чтобы мускл правильно это делал

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

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

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

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

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

и тут уже пошли джоины таблиц файлы и шинглы
...
Рейтинг: 0 / 0
30.05.2014, 21:11:50
    #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
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Оптимизация запроса для алгоритма шинглов / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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