LINUX.ORG.RU

«Агрегация» данных, sql


0

0

Здравствуйте.

Есть табличка в mysql где с некоторым интервалом записываются некоторые события.

Есть еще одна табличка где есть другие события, так же с интервалом.

Эти таблички связаны между собой по одному полю.

Надо найти для события из 1ой таблицы ближайшее событие во второй таблице и свалить все это вместе в третью таблицу.

Сейчас все сделано очень тупо. Идет куча запросов (для каждой записи из первой таблице по запросу во вторую, а потом все это скидывается в третью)

Как можно сделать это более оптимально и где про это можно прочитать?

а то уж слишком тормооозит...

Заранее благодарен.

anonymous

> Сейчас все сделано очень тупо. Идет куча запросов (для каждой записи из первой таблице по запросу во вторую, а потом все это скидывается в третью)

Имхо ничего радикально лучшего сделать нельзя. Любому алгоритму
придется пробежаться циклом по одной таблице и для каждого ее элемента
заглянуть во вторую.


Можно повыеживаться с stored procedure или чем еще и исполнить этот
цикл на сервере. Думаю, будет не сильно быстрее, если только ты к
серверу не по диалапу ходишь.


У тебя запрос заглядывания во вторую таблицу оптимизирован? Чтоб найти
ближайшее событие к заданному datetime... за 2 загляда в индекс.. надо
что-то вроде такого чтоли написать


select * from (
select max(xdate) X from table2 where xdate <= '$event_date'
union all
select min(xdate) X from table2 where xdate >= '$event_date'
) Z
order by
(UNIX_TIMESTAMP(X) - UNIX_TIMESTAMP('$event_date'))
desc limit 1;

(Если кто знает как это эффективно одним select'ом сделать, скажите плз!)



gods-little-toy ★★★
()

1. Использовать для потоковых данных mysql - нерационально. Для этого есть специализированные потоковые СУБД.

2. Если вы бедны, как церковная мышь (с шариком такая, с двумя кнопками, 91го года выпуска), и не можете себе такую СУБД позволить - то решение только одно: select * from ... order by date, то же для второй таблицы, и читать каждую последовательно. Это быстро, только высосать придётся в процессе всю базу. Зато запросов только два.

3. Не надо использовать РСУБД для потоковых данных!

4. Нельзя использовать РСУБД для потоковых данных!

5. Используйте потоковые СУБД!

anonymous
()
Ответ на: комментарий от gods-little-toy

это mysql и поэтому хранимых процедур нема...

и в первой и во второй таблице есть timestamp

так что поиск во второй делается так:

select date_from_table_1;

for i in $rows_from_table_1 do select * from table_2 where date >= $date_from_table_1 limit1; done;

Я имел ввиду вывод всего это безобразия из sql в какой-либо язык программирования.

Т.е. я хочу загрузить данные за определенный период из 1ой и 2ой таблицы и работать с ними на уровне объектов...

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

Надеюсь понятно объяснил.

anonymous
()
Ответ на: комментарий от anonymous

> Используйте потоковые СУБД!

wow... Про это почитать ничего не порекомендуете? Нету ли какой-нибудь нетяжелой потоковой СУБД которую можно бесплатно скачать и посмотреть?

gods-little-toy ★★★
()
Ответ на: комментарий от anonymous

1) Этой не мой выбор. Софт есть написанный софт. Есть база.
Надо расширять функционал.

2) Вот это то мне и интересно как грамотно сделать...

3) А что есть для потоковых данных?

anonymous
()
Ответ на: комментарий от gods-little-toy

Вот, например, комбинированная СУБД: http://kx.com/

Скачать так вот запросто никто не даст. :(

И, боюсь, ничего лёгкого и дешевого в этой области не найти, поскольку главный потребитель потоковых СУБД - большие и жирные банки. Которые любят платить большие и жирные бабки. На них то все производители и ориентируются.

anonymous
()
Ответ на: комментарий от anonymous

Для один раз собрать всё из двух таблиц в одну - на самом деле производительность роли не играет. А так - select для заданного периода order by date из каждой таблицы, и читать построчно, пропуская те записи второй таблицы, которые не попадают в диапазон, считающийся близким для текущей записи первой таблицы.

anonymous
()
Ответ на: комментарий от anonymous

Так это всё только половинки от streaming dbms. А второй половинки - нормального и шустро работающего механизма запросов (типа тех, что в обсуждаемой задаче) - на халявку и нет.

anonymous
()
Ответ на: комментарий от anonymous

> Т.е. я хочу загрузить данные за определенный период из 1ой и 2ой таблицы и работать с ними на уровне объектов...

И в чем конкретно проблема?

> Просто я не знаю как например если все это отобразить на массив структур, как потом делать поиск ближайшего... и.т.д...

Все предложенные методы выдадут пары, отсортированные по дате. Ты в мыссиве этих пар хочешь поиск по дате делать? И не знаешь как сравнивать даты? Ну, делай во всех запросах select все-что-надо, unix_timestamp(date_col), и будут у тебя даты в виде int'ов.

Не очень понял вопроса, надеюсь ответ по теме получился... если нет, объясни поподробнее чего надо.

gods-little-toy ★★★
()
Ответ на: комментарий от anonymous

если смотреть на первую ссылку то вроде есть (см. tutorial). может и по остальным ссылкам тож... И как я понял это называется не dbms а dsms

anonymous
()
Ответ на: комментарий от gods-little-toy

что сравнение это понятно... я имел ввиду, что не знаю как это наиболее оптимально сделать...

anonymous
()
Ответ на: комментарий от anonymous

> что сравнение это понятно... я имел ввиду, что не знаю как это наиболее оптимально сделать...

Брр ... У тебя данные из базы поступают упорядоченные по дате. Складывай их в массив, получишь упорядоченный массив, в котором можно делать двоичный поиск http://ru.wikipedia.org/wiki/%D0%94%D0%B2%D0%BE%D0%B8%D1%87%D0%BD%D1%8B%D0%B9...

Вообще, у тебя язык какой? Щас в каждом языке всяких контейнеров дофига. Думать о том какие контейнеры будут оптимальными можно будет когда ты определишься с

- используемым языком :-)

- структурой данных

- набором операций над этими данными

gods-little-toy ★★★
()

Можно оптимизировать запрос для второй таблицы, если есть предположения на частоту появления вторых событий.
Если запрос не вернет ничего, повторить запрос на всю таблицу. И, допустим изменить интервал ожидания события.

anonymous
()
Ответ на: комментарий от anonymous

События обычно приходят с такой же частотой как и в первой таблице. Но иногда бывают "провалы". Т.е. данных просто нет.

anonymous
()
Ответ на: комментарий от anonymous

Hint: первую таблицу читаем построчно, вторую читаем в очередь. Извлекаем из очереди только близкие к текущей записи, записи с датой меньшей чем у текущей и при этом не близкие извлекаем и выбрасываем.

Тупо и тривиально на ЛЮБОМ языке, даже на жабе или пыхпыхе.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.