Похоже, вы должны использовать триггеры .
Вам понадобится три триггера на большом столе:
- ПОСЛЕ ВСТАВКИ, для каждой строки необходимо скопировать новую строку в меньшую таблицу и удалить самую старую строку из меньшей таблицы
- ПОСЛЕ ОБНОВЛЕНИЯ, для каждой строки вам нужно проверить, находится ли эта строка в меньшей таблице, и, если она есть, внести в нее те же самые обновления
- ПОСЛЕ УДАЛЕНИЯ, для каждой строки вам нужно проверить, находится ли эта строка в меньшей таблице, и, если она есть, удалить ее.
Например:
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 не материализуются, так что вы, как правило, не получите никакого выигрыша в производительности (а это то, что вам нужно), и вы не сможете индексировать представление иначе, чем таблицы (таблицы), для которых это представление на основе.