我在一个MySQL (Version5.0)数据库中有一个很大的表(几百万行),其中的数据以非常频繁的速度插入其中。
还有一些不太频繁的针对数据库的select语句,只需要最新的数据(即最新的10000行),有没有办法创建一个表,它将保留主表中的数据副本,并在向主表添加新行时动态添加新行(我可以定期删除旧数据,因此这不是一个太大的问题),而不会对主表造成太大影响。
如果可能的话,我也想索引在第二个表稍微不同的行。
发布于 2009-10-08 13:16:46
听起来你应该使用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中的视图没有具体化,因此您通常不会获得任何性能优势(这听起来就是您想要的),并且您不能以不同于视图所基于的表的方式对视图进行索引。
https://stackoverflow.com/questions/1537701
复制相似问题