powered by simpleCommunicator - 2.0.47     © 2025 Programmizd 02
Форумы / NoSQL, Big Data [игнор отключен] [закрыт для гостей] / MySQL и очень большая таблица + having
6 сообщений из 6, страница 1 из 1
MySQL и очень большая таблица + having
    #38173449
Cxd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cxd
Гость
Коллеги, добрый день.
Нужна помощь...
Данные:
34млн записей в таблице

Код: sql
1.
2.
3.
4.
5.
6.
SELECT COUNT(*) AS distance, good_id FROM `hashes` 
WHERE `hash` IN(-1,-2,-3,-4,-5,-6,-7,-8,9,10,11,12,-13,-14,-15,-16,17,18,19,20,-21,22, итд ... до длинны хеша)
GROUP BY good_id 
HAVING distance > 59 
ORDER BY distance
DESC LIMIT 1800



Как видно запрос просто ужасный, выполняется 6-8 секунд... Это просто кошмар.
Смысл в том что у нас есть целочисленый хеш определенной длинный и нам нужно найти все товары у которых совпадает к примеру больше 59 битов. Сврего рода нечеткйи поиск, но со своей спецификой.
Как хранятся данные.
1ин хеш это n записей в таблице hashes где n - колличество бит в хеше, в колонке hash хранится значение одного разряда, т.е если значение опложительное и находится в первом разряде значит будет '1', если 5ый разряд будет '5', если в 6ом разряде ноль, значит будет '-6'.
Понятно что при запросе у нас и full scan и file sort и все все что тольк может быть...
Подскажет как можно поменять структуру таблицы, или использовать что то отличное от MySQL myisam, пока посматриваем в сторону mongoDB с ее Map/Reduce, но может есть еще что более подходящее...
...
Рейтинг: 0 / 0
MySQL и очень большая таблица + having
    #38173463
Cxd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cxd
Гость
Чуть не забыл вот структура таблицы.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
delimiter $$

CREATE TABLE `hashes` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `good_id` int(10) unsigned NOT NULL,
  `hash` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `hash_good_id_index` (`good_id`),
  KEY `hash_hash_good_id_index` (`hash`,`good_id`)
) ENGINE=MYISAM$$
...
Рейтинг: 0 / 0
MySQL и очень большая таблица + having
    #38174098
madbear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cxd, здесь была дискуссия, гляньте
...
Рейтинг: 0 / 0
MySQL и очень большая таблица + having
    #38175104
Cxd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cxd
Гость
madbear,
Интересно, но всеравно full scan... Но есть решения поинтереснее
Metric tree
BK-tree
M-tree
VP-tree
Cover tree

Еще бы понять как это прикрутить к БД
...
Рейтинг: 0 / 0
MySQL и очень большая таблица + having
    #38203025
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
можно попробовать так
1. пихаем все что внутри in() в memory-таблицу
2. делаем запрос с применением inner join по полю `hash`

если будете пробовать -отпишите выросла ли скорость.
...
Рейтинг: 0 / 0
MySQL и очень большая таблица + having
    #38209287
Cxd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cxd
Гость
chabapok,
все намного проще.
Пришлось отказатся от такого способа хранения данных. Решили просто ложить хеши как есть, в виде чисел, а потом просто используя битовые операции выполняем запрос.
Даже с учетом того что мускуль делает фулл скан, пробежатся по 500тыщам записей проще чем по 32ум милионам (500*мерность хеша), т.е из 2ух зол выбрали наименьшее. Это дало прирост в скорости на порядок.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / NoSQL, Big Data [игнор отключен] [закрыт для гостей] / MySQL и очень большая таблица + having
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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