Репликация части таблицы в той же базе данных в MySQL - PullRequest
0 голосов
/ 08 октября 2009

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

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

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

Ответы [ 2 ]

2 голосов
/ 08 октября 2009

Похоже, вы должны использовать триггеры .

Вам понадобится три триггера на большом столе:

  • ПОСЛЕ ВСТАВКИ, для каждой строки необходимо скопировать новую строку в меньшую таблицу и удалить самую старую строку из меньшей таблицы
  • ПОСЛЕ ОБНОВЛЕНИЯ, для каждой строки вам нужно проверить, находится ли эта строка в меньшей таблице, и, если она есть, внести в нее те же самые обновления
  • ПОСЛЕ УДАЛЕНИЯ, для каждой строки вам нужно проверить, находится ли эта строка в меньшей таблице, и, если она есть, удалить ее.

Например:

DELIMITER //
CREATE TRIGGER after_insert AFTER INSERT ON big_table
FOR EACH ROW
BEGIN
    DECLARE small_table_rows INTEGER;
    INSERT INTO small_table (field1, field2) VALUES (NEW.field1, NEW.field2);
    SELECT COUNT(*) INTO small_table_rows FROM small_table;
    IF small_table_rows > 10000 THEN
        DELETE FROM small_table ORDER BY id ASC LIMIT 1;
    END IF
END;//
DELIMITER ;

DELIMITER //
CREATE TRIGGER after_update AFTER UPDATE ON big_table
FOR EACH ROW
BEGIN
    UPDATE small_table
    SET field1 = NEW.field1, field2 = NEW.field2
    WHERE small_table.id = NEW.id;
END;//
DELIMITER ;

DELIMITER //
CREATE TRIGGER after_delete AFTER DELETE ON big_table
FOR EACH ROW
BEGIN
    DELETE FROM small_table WHERE small_table.id = OLD.id;
END;//
DELIMITER ;

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

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

1 голос
/ 08 октября 2009

Вы можете использовать ПРОСМОТРЫ , которые будут обновляться, если родитель обновляется, или вы можете использовать Триггеры

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