Вячеслав Успенский: в синтетических тестах, то есть тесты ради тестов. Если бы вы знали как устроены 2 вида этих баз вы бы не писали такое. Я бы не стал использовать джоины.
Вячеслав Успенский: Join и nosql ? зачем вам оно тогда, оно не создано для этого! Но в любом случае все зависит от схемы по которой вы решаете задачу. Никогда еще реляционные базы не выигрывали по скорости перед nosql решениями.
Дмитрий Энтелис: По описанному вами вы перекинули задачу на пхп где есть и демоны и воркеры. В ноде же этого нет, там 1 процесс с очередью разбора запросов. Можно так же в приложении и хранить изменение данных и брать их из переменной процесса, даже если у нас нет сокетов. Но если уйти от варианта с нодой и вернуться к Пхп то ваш вариант с рэббитом проигрывает обычному запросу к базе. Потому что все что вы описали нужно настраивать и с очередью.
---
Соответственно надо научить подключаться к нему, убеждаться что все хорошо, прописывать поведение когда демон мертв, думать что делать если демонов несколько итд итп, в общем изобретать кучу велосипедов которые отлично решаются с помощью любого из существующих серверов очередей.
---
вот это все какой то вакуум не из этой задачи. Так что во второй раз вы не попали с дополнительным стеком.
Это хорошо что вы знаете о таких вещах, но блин нельзя всем советовать устанавливать что нибудь еще, когда это можно сделать все просто из уже имеющихся средств.
Дмитрий Энтелис: может быть вы не понимаете того что понимаю я ? Или я не понимаю. Разберите пожалуйста мои мыли, и укажите в чем я могу быть не прав.
Есть 2 абстракции. Первая (А) - я ,который сижу на какой либо странице и жду когда что-то произойдет. В данной ситуации база данных обновилась. Вторая (Б) - человек который обновил базу скриптом на нашем сервере.
Вариант 1. Веб сокеты.
Приложение подобно чату. Мы записываем всех подключенных клиентов. (Б) при вызове метода добавления в базу чего-либо вызывает метод add. Который у нас проходится по всем слушателям и отправляет им сообщение методом send. Они же подписаны на событие message и обновляют информацию на экране. (А) видит что в базу что-то попало.
Вариант 2. Ajax
Мы раз в 2-3 секунды стучимся на сервер и опрашиваем базу банальным и самым быстрым запросом на чтение где берем например максимальный идентификатор и сравниваем его с уже имеющимся, и выбираем нужные нам данные. Можно даже 1 запросом это делать. Запрос такой 3-5 мс выполняется. Время на подключение к базе не учитываем, можно не открывать каждый раз новое подключение. Издержки практически нулевые.
Вот 2 моих варианта. Без каких либо добавлений в стек технологий.
Первый вариант я с вашим не рассматриваю, мой уже лучше и быстрее. Так как нет никаких издержек на не нужные очереди, при добавлении данных в базу мы сразу рассылаем всем подключившимся информацию.
Второй вариант. Разницы никакой нет, вы подключаетесь к рэббиту через брокера, либо вы подключаетесь к базе. Лага никакого нет, не забывайте что мы делаем это не на соккетах и при обращении к очереди вы так же испытаете эту задержку. Как вы собираетесь по другому пути обращаться к очереди я не понимаю. Какие воркеры вы имеете ввиду ? 1 воркер = 1 запрос который потом отпадает.
Почему логика отделена, при чем тут демон, мы о nodejs говорим ? Для этого существуют события. Мы можем выбрасывать событие записи в базу данных, и его обрабатывать. Нам не важно что и как происходит в этой логике. У нас есть событие и есть его обработчик. Они могут быть в любых прослойках нашего приложения.
Научить???
var WebSocketServer = new require('ws');
var webSocketServer = new WebSocketServer.Server();
Научил ? Когда он мертв мертво наше приложение. Не понимаю дальше о каких демонах вы говорите, почему их несколько, может быть и можно ими управлять но зачем ?
Если я не понимаю чего нибудь покажите статью где это решение описано лучше. Может быть реально я чего то не знаю.
Может быть еще Open Office установить и ваш любимый сфинкс. Записывать в ексель документ запись о добавлении в таблицу, индексировать сфинксом это все дело и потом еще Рэббит подключить. Огненный стек получится, а главное столько всего подключено, как вы любите!!!
Зачем все это тут нужно ? Какая разница что пользователь будет стучаться за данными в базу и смотреть появилось что-то или нет, или в вашу очередь ? Что от этого меняется ? ЗАЧЕЕЕЕМ тут вообще эта очередь ?
Тут если идет соединение на сокетах то пусть при добавлении в базу и посылает ответный месседж всем слушателям.
Если без них то по таймеру как указал автор с указанием последнего полученного значения.
@Ras: оболочки нет. Голая база данных оптимизированная под мои нужды и запросы. Внутренние поиски мы проводим с помощью нашего приложения. Но его я не продаю. до 2012 года полное покрытие по маркам и моделям. в данный момент в базе более 110 тысяч модификаций транспорта. Каждая марка связана с деталями. Как с оригинальными так и с аналогами. После 2012 года я не могу ручаться за полную поддержку всего модельного ряда. Но она пополнялась до сегодняшнего дня. Мы просто решили пойти другим путем и полная актуальность базы на данный момент нам не нужна.
@DmitriyEntelis: опечатка, в моем запросе это не нужно ORDER BY RAND()
Поэтому запрос что привел я рандомит по ROUND(RAND()) =1, это как пример, вы можете написать любую функцию вычисления случайного числа и потом сравнивать с каким нибудь другим случайным числом.
Вы конкретно спросили - мне очень интересно, как вы планируете в чистом mysql выбирать случайные записи.
я вам конкретно ответил с примером. На чистом sql ? ДА! Вы теперь вернулись к условию автора, хорошо. Начинаем с начала. Ваше кстати решение так же возвращает ваши сотни тысяч данных в пхп. Мое же работает только в базе и возвращает 10 значений.
но так как вы упорно не видите о чем я вам пишу давайте разберем ваше решение.
1)Первое что нужно найти автору это все совпадения с его запросом.(Вернулись сотни тысяч ИД из сфинкса)
2)Вы эти сотни тысяч засовываете в пхп скрипт и выбираете случайные 10
3)Вы передаете эти значения в запрос к базе данных
Не вижу чем ваше решение отличается от решения автора ? Все тоже самое. Только добавился еще сфинкс. Все тоже самое можно сделать в одной базе, запросы выше. Вы теперь это понимаете ?
Если мы говорим о действительном рандоме всех записей то ORDER BY RAND() тут не играет собственно никакой роли, на таблице в 1кк записей поиск по LIKE у меня занял 2.3 секунды и вернулось более 200 записей, с RAND() поиск занял 2.35.
Предложенный мной вариант вернет рандомные записи в первой части данных, что полностью решает поставленную задачу автора. Без Сфинкса !!!
@DmitriyEntelis: Не очень хочу с вами спорить. У нас большое различие в подходе и в применимых знаниях. Вам что бы узнать максимальный ид подзапроса нужно возвращать данные или делать 2 запрос, мне только обратиться к переменной что была в запросе ниже. Оверхед ? Да минимальный самый. Сделайте бенчмарк инкремента. На 100кк записей 1.4 секунды на моей конфигурации. Если кому то нужно будет с таким объемом данных что то сделать... Я не знаю кому это может придти в голову.
Как на чистом SQL, а не mysql выбрать данные ? Автор написал реализацию с LIKE RAND(). Я ее предложил заменить на полнотекстовый поиск с подзапросом, что можно в принципе сделать и без него, данные он в предикате сокращает в численности, а далее к ним уже добавляется функция рандома. Так же ниже есть ссылка на такие же рандомные выборки. Вот так примерно я и планировал.
Конкретный запрос вот такой
SELECT * FROM table WHERE MATCH() AGAINST() AND ROUND(RAND()) =1 ORDER BY RAND() LIMIT 10
@DmitriyEntelis: Если нам нужно вытащить 20 случайных записей из базы то логично :) что логика этого процесса должна находиться в базе. Когда все это можно сделать только в ней. Если человек настроит нормально полнотекстовый поиск в своей базе то менять ничего не нужно.
То есть на больших объемах настройка сфинкса чем то будет отличаться ? Хотелось бы узнать чем.
@DmitriyEntelis: я не рассматриваю LIKE в данном ключе вообще никак, вы советуете автору изменить бизнес логику размазав ее по 3 уровням. Если не брать LIKE во внимание можно все сделать на постгресе например в его среде. Поверьте будет не хуже сфинкса! Только это все происходить будет в 1 месте вместо ваших трех. Если брать Mysql то у него так же есть полнотекстовый поиск, который в различных ветках этой базы отличается по производительности. Опять же, заменить базу и сделать все что нужно в ней.
А сфинкс надо еще настроить и проиндексировать. Ну а с РТ индексами мало кто умеет работать правильно.
@WebEditor демо нет, продажа этой информации для меня не приоритетна. По запросу могу выдать те или иные данные. В базе порядка 5 млн запчастей и около 30 млн кросов.
Основная база - Тех дoк.
вагоны, камазы, трактора, мото и прочее уже не помню откуда брал. Было много сайтов, дисков было еще больше обработано. Парсилось все для внутренней системы по поиску автозапчастей.