gpt4 book ai didi

mysql - 在 MySQL 的同一数据库中复制表的一部分

转载 作者:行者123 更新时间:2023-11-29 06:23:39 25 4
gpt4 key购买 nike

我在 MySQL(版本 5.0)数据库中有一个大表(几百万行),数据以非常频繁的速度插入其中。

还有一些不太频繁的针对数据库执行的 select 语句,只需要最新的数据(即最新的 10000 行),有没有一种方法可以创建一个表,该表将保留主表中的数据副本并动态地每当向主表添加新行时添加新行(我可以定期删除旧数据,这样就不会造成太大问题),而不会对主表造成太大影响。

如果可能的话,我还想对第二个表中的行进行稍微不同的索引。

最佳答案

听起来你应该使用 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 可能会提供更好的整体性能,具体取决于您运行的查询类型。

您不想使用 View ; MySQL 中的 View 没有具体化,因此您通常不会获得任何性能优势(这听起来像是您想要的),并且您将无法以不同于 View 所在表的方式对 View 进行索引基于。

关于mysql - 在 MySQL 的同一数据库中复制表的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1537701/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com