我在MySQL(5.0版)数据库中有一个大表(数百万行),它以非常频繁的速率插入数据。
对数据库执行的select语句也不那么频繁,只需要最新的数据(即最新的10000行),有没有办法创建一个表来保存主表中的数据副本并动态生成每当在主表中添加新行时添加新行(我可以定期删除旧数据,这不是太大的问题),而不会对主表造成太大影响。
如果可能的话,我还希望第二个表中的索引行略有不同。
答案 0 :(得分:2)
听起来你应该使用triggers。
大表上需要三个触发器:
例如:
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 :(得分:1)