MySQL денормализация с триггерами, конкретные советы - PullRequest
0 голосов
/ 27 декабря 2011

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

Проблемы с текущим методом запроса:

  1. Медленное время запроса, для доступа к информации для этого варианта использования требуется от 8 до 12 соединений (некоторые из левых соединений). Для некоторых запросов это может занять ~ 3000 мс.

  2. Блокировка / блокировка таблицы , когда информация обновляется в загруженное время дня или недели (поскольку я использую таблицы MyIsam), запросы блокируются / блокируются, и это может вызвать дальнейшие проблемы (соединения заканчиваются, производительность хуже)

Я использую Hibernate (3.5.2), Mysql 5.0 (все таблицы MyIsam) и Java 1.6

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

На ум приходит следующее

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

Я ищу:

  1. Gotchas - вещи, о которых я, возможно, не думаю, повлияет на мой желаемый результат.
  2. Специальные настройки MySql, которые могут улучшить производительность, уменьшить блокировку / блокировку на денормализованной таблице.
  3. Лучшие подходы к написанию триггеров для этого сценария.

Дайте мне знать, если какая-либо другая информация необходима для ответа на этот вопрос.

Приветствие.

Ответы [ 2 ]

1 голос
/ 25 января 2012

Я сейчас это реализовал, поэтому я решил поделиться тем, что я сделал, я попросил помощника, который является dba (Грег), дать несколько советов, и его ответы в основном привели мою реализацию:

В любом случаекак «Catcall», подразумеваемое использованием TRIGGERS (по крайней мере, в моем случае), вероятно, было не лучшим решением.Грег предложил создать две денормализованные таблицы с одинаковой схемой, а затем создать VIEW, который чередует две денормализованные таблицы, одна из которых является «активной», а другая «деактивированной», и активная таблица будет активно запрашиваться моей сетью.Приложение и деактивированная таблица могут быть обновлены денормализованной информацией.

Мое приложение будет выполнять запросы к VIEW, имя которого останется прежним.

В этом суть.

Некоторые подробности реализации (mysql 5.0.n):

Я использовал хранимые процедуры для обновления информации, а затем переключил представление с denorm_table_a на denorm_table_b.

Необходимо обновить разрешения для пользователя моей базы данных GRANT CREATE, CREATE VIEW, EXECUTE, CREATE ROUTINE, ALTER ROUTINE, DROP, INSERT, DELETE, UPDATE, ALTER, SELECT, INDEX для dbname. * TO 'dbuser'@ '%';

Для создания копии таблицы: CREATE TABLE ... LIKE ....;Команда действительно полезна (она также копирует определения индекса)

Создание ПРОСМОТРА было простым СОЗДАНИЕ ИЛИ ЗАМЕНА ПРОСМОТРА denorm_table AS SELECT * FROM denorm_table_a;

СОЗДАТЬ ИЛИ ЗАМЕНИТЬ ПРОСМОТР denorm_table AS SELECT * FROM denorm_table_b;

Я создал специальный объект «Денормализованный запрос» на своем среднем уровне, который затем отображался (через спящий режим) на денормализованную таблицу (или на самом деле Просмотр) и позволял легко и гибко запрашивать через механизм Критерии гибернации.

В любом случае, надеюсь, что это поможет кому-то, если кому-то понадобятся какие-либо подробности, дайте мне знать,

Приветствия Симона

0 голосов
/ 20 ноября 2014

Вот решение, которое я использовал для денормализации отношения «один ко многим» в MySQL, используя хранимую процедуру и триггеры:

https://github.com/martintaleski/mysql-denormalization

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

...