dplyr - использование индексов для оптимизации запросов - PullRequest
0 голосов
/ 01 марта 2019

На моей работе мы работаем с базами данных (MySQL 5.7.2 преимущественно; это то, что я не могу изменить).Задача обычно состоит в том, чтобы писать сложные запросы к наборам данных стоимостью в миллионы строк.Это делается с помощью потока запросов MySQL, построенных друг на друге (каждый из них является временной таблицей; следующая временная таблица строится на предыдущих и т. Д.).Поскольку строки исчисляются миллионами с использованием объединений из нескольких столбцов, для этих временных таблиц выполняется индексация с использованием операторов alter table.

Теперь, когда я попытаюсь понять использование dplyr и исследовать возможности конвейеров, похоже, чтопрекрасное решение для тех проблем, которые мы решаем;т.е. запросы строятся друг на друге.Поэтому я написал простые сценарии, которые используют силу dplyr.Я отправляю все запросы обратно в MySQL, чтобы оценить окончательный результат (конечный результат - всего несколько сотен строк).Таким образом, вся обработка будет выполняться на удаленном сервере MySQL без необходимости извлечения миллионов строк в локальный экземпляр R, и только локальный экземпляр R будет извлекать только набор результатов.

Однако я сталкиваюсьузкое место, где необходима индексация;и это абсолютно необходимо из-за проблем с производительностью.Как я вижу, я могу использовать функцию copy_to в dplyr, которая дает мне возможность добавлять индексы;меня здесь беспокоят две вещи:

  1. Мне нужно создать новую таблицу на удаленном сервере MySQL для хранения результата copy_to (в большинстве случаев нам разрешены только временные таблицы).

  2. Даже если мне как-то удастся написать постоянную таблицу, функция copy_to не позволяет мне определить свое собственное имя индекса, как в MySQL;в то время как имя по умолчанию, которое оно предлагает, слишком длинное, чтобы MySQL мог его принять (выдает ошибки по длине имени индекса).

Любые советы по использованию индексов с dplyr будут высоко оценены.В идеале я хочу что-то вроде того, что показано в полужирный ниже:

Tbl1%>% filter (...)%>% mutate (...)%>% left_join (Tbl2,by («col1» = «col1», «col2» = «col2»)%>% add_index (col_from_tbl1, col_from_tbl2) %>% других операций

Кстати, я вижуРешение для длинного имени индекса состоит в том, чтобы скопировать в новую таблицу, а затем использовать DBI :: dbSendQuery для добавления индекса с именем по моему выбору, это работает. Однако необходимость в индексации очень частая. Это делает элегантность использования каналов исчезающей,так как мне нужно остановиться в середине цепочки конвейеров, скопировать в новую таблицу, затем добавить индекс с помощью dbSendQuery, а затем снова начать использовать каналы. Весь смысл иметь хороший читаемый код исчезает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...