2010-11-11 2 views
7

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

У меня есть 2 основные причины, чтобы сделать это:

  1. Денормализация

    я нормализовал таблицы как можно больше. Таким образом, есть ситуации, когда мне придется объединять многие таблицы, чтобы извлекать данные. Мы работаем с MySQL Cluster, который имеет довольно низкую производительность, когда дело доходит до JOIN.

    Так что мне нужно создать Denormalized Tables, который может работать быстрее SELECT.

  2. Обобщить данные

    К примеру, у меня есть таблица сделок с несколько миллионов записей. Сделки совершаются с разных сайтов. Приложение должно генерировать отчет, отображая ежедневные или ежемесячные суммы транзакций и общую сумму дохода на веб-сайт. Я не хочу, чтобы сценарий отчета вычислял это каждый раз, поэтому мне нужно создать сводную таблицу, которая будет разбита на [сайт, дата].

    Это просто один простой пример. Существует множество различных сводных таблиц, которые мне нужно создавать и поддерживать.

В прошлом я сделал это, написав несколько сценариев cron, чтобы обновлять каждую сводную таблицу. Но в этом новом проекте я надеюсь реализовать более элегантное и правильное решение.

Я предпочел бы решение на базе PHP, поскольку я не являюсь администратором сервера, и я чувствую себя наиболее комфортно, когда могу управлять всем через свой код приложения.


Решения, которые я рассмотрел:

  1. Копирование вида по

    Если результирующая таблица может быть представлена ​​в виде одного запроса на выборку, я могу генерировать VIEW , Поскольку они медленные, может быть cronjob, который копирует этот VIEW в реальную таблицу.

    Однако некоторые из этих запросов SELECT могут быть настолько медленными, что это неприемлемо даже для cronjobs. Не очень эффективно воссоздать все сводные данные, если старые строки даже не обновляются.

  2. Пользовательские Cronjobs для каждой сводной таблицы

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

  3. MySQL Триггеры

    Можно добавить триггеры основных таблиц, так что каждый раз, когда есть INSERT, UPDATE или DELETE, сводные таблицы обновляется соответствующим образом.

    Не было бы cronjobs, и резюме были бы в режиме реального времени. Однако, если когда-либо возникнет необходимость перестроить сводную таблицу с нуля, ее нужно будет сделать с помощью другого решения (вероятно, № 1 выше).

  4. Использование ORM Крючки/Триггеры

    Я использую Учение как мой ОРМ. Существует способ добавить прослушиватели событий, которые будут запускать материал в INSERT/UPDATE/DELETE, который, в свою очередь, может обновлять сводные таблицы. В некотором смысле это решение похоже на № 3 выше, но я буду лучше контролировать эти триггеры, поскольку они будут реализованы в PHP.


реализации соображения:

  1. Полное перестроение

    Я хочу, чтобы избежать необходимости восстановления сводных таблиц, для повышения эффективности, и только обновление для новые данные. Но в случае, если что-то пойдет не так, мне нужна возможность перестроить сводную таблицу с нуля, используя существующие данные в основных таблицах.

  2. Игнорирование UPDATE/DELETE на Old Data

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

    Но, конечно же, это не распространяется на все таблицы.

  3. ведение журнала

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

    Для обобщения новых данных сводный процесс просто должен запомнить последний идентификатор первичного ключа для последних суммируемых им записей. В следующий раз, когда он запустится, он может суммировать все после этого id. Однако, чтобы отслеживать старые записи, которые были обновлены/удалены, ему нужен еще один журнал, чтобы он мог вернуться и повторно суммировать эти данные.


Я был бы признателен за любые стратегии, предложения или ссылки, которые могут помочь. Спасибо!

+0

Материализованные виды - это виды, которые можно индексировать (называемые «индексированные представления» в терминологии TSQL/SQL Server). Они, как известно, ограничены функциональностью, а MySQL их не поддерживает. MySQL едва поддерживает не материализованные представления, сравнивая функциональность с другими поставщиками. Oracle - это единственная другая БД, которую я знаю, которая поддерживает материализованные представления, помимо SQL Server. Я бы ожидал, что DB2 будет работать, но PostgreSQL этого не делает. –

ответ

2

Как уже отмечалось выше, материализованные представления в Oracle отличаются от индексированных представлений в SQL Server. Они очень классные и полезные.См. http://download.oracle.com/docs/cd/B10500_01/server.920/a96567/repmview.htm для получения более подробной информации.

У MySql не поддерживается.

Одна вещь, которую вы упоминаете несколько раз, - это плохая работа. Вы проверили свой дизайн базы данных для правильной индексации и запустили планы объяснений по запросам, чтобы понять, почему они медленны. См. Здесь http://dev.mysql.com/doc/refman/5.1/en/using-explain.html. Это, конечно, предполагает, что ваш сервер настроен правильно, у вас есть настройка и настройка mysql, например. буферные кеши и т. д. и т. д. и т. д.

К вашему прямому вопросу. Похоже, что вы хотите сделать, это то, что мы часто делаем в ситуации с хранилищем данных. У нас есть производственная база данных и DW, которые извлекают все виды информации, агрегаты и предварительно какулируют ее, чтобы ускорить запрос. Это может быть излишним для вас, но вы можете решить. В зависимости от времени ожидания, которое вы определяете для своих отчетов, то есть как часто они вам нужны, мы обычно периодически проверяем процесс загрузки ETL (извлечение трансформирования) (ежедневно, еженедельно и т. Д.) Для заполнения DW из производственной системы. Это снижает влияние на производственную систему и перемещает всю отчетность на другой набор серверов, что также снижает нагрузку. На стороне DW я обычно проектировал бы свои схемы разными, то есть с использованием звездных схем. (http://www.orafaq.com/node/2286) Звездные схемы имеют таблицы фактов (вещи, которые вы хотите измерить) и размеры (вещи, которые вы хотите агрегировать измерениями (время, география, категории товаров и т. д.). SQL Server, они также включают в себя дополнительный механизм, называемый службами анализа SQL Server (SSAS), для просмотра таблиц и измерений фактов, предварительного вычисления и сборки кубов данных OLAP. В этих кубах данных вы можете развернуть и посмотреть все типы шаблонов, сделать данные анализ и интеллектуальный анализ данных. Oracle делает все по-другому, но результат тот же.

Если вы хотите перейти по маршруту, это действительно зависит от потребностей бизнеса и того, какое значение вы получите от анализа данных. Как я уже сказал, это скорее всего, переполнят, если у вас будет только несколько сводных таблиц, но некоторые из концепций, которые вы можете найти полезными, как вы думаете. Если ваш бизнес идет в сторону бизнес-аналитики sol Это то, что нужно учитывать.

PS Вы можете установить DW для работы в режиме реального времени с использованием ROLAP, если это необходимо для бизнеса. У Microstrategy есть хороший продукт, который хорошо работает для этого.

PPS Вы также можете посмотреть PowerPivot от MS (http://www.powerpivot.com/learn.aspx) Я только играл с ним, поэтому не могу рассказать вам, как он работает на очень больших наборах данных.

3

Flexviews (http://flexvie.ws) - это проект на основе PHP/MySQL с открытым исходным кодом. Flexviews добавляет постепенно обновляемые материализованные представления (например, материализованные представления в Oracle) в MySQL, usng PHP и хранимые процедуры.

В него входит FlexCDC, утилита для записи данных на основе PHP, которая считывает двоичные журналы и хранимые процедуры Flexviews MySQL, которые используются для определения и поддержки представлений.

Flexviews поддерживает объединения (только для внутреннего соединения) и агрегацию, поэтому его можно использовать для создания сводных таблиц. Кроме того, вы можете использовать Flexviews в сочетании с дизайнером агрегации Mondrian's (ROLAP server) для создания сводных таблиц, которые инструмент ROLAP может автоматически использовать.

Если у вас нет доступа к журналам (он может читать их удаленно, так что вам не нужен доступ к серверу, но вам нужны SUPER privs), то вы можете использовать «COMPLETE» обновление с помощью Flexviews. Это автоматизирует создание новой таблицы с помощью «CREATE TABLE ... AS SELECT» под новым именем таблицы. Затем он использует RENAME TABLE для замены новой таблицы на одну, переименовав старый с помощью postold. Наконец он отбрасывает старую таблицу. Преимущество здесь в том, что SQL для создания представления хранится в базе данных (flexviews.mview) и может быть обновлен с помощью простого вызова API, который автоматизирует процесс подкачки.

Смежные вопросы