Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL Inndob从非常大的数据库中删除/清除行_Php_Mysql_Database_Innodb_Lamp - Fatal编程技术网

Php MySQL Inndob从非常大的数据库中删除/清除行

Php MySQL Inndob从非常大的数据库中删除/清除行,php,mysql,database,innodb,lamp,Php,Mysql,Database,Innodb,Lamp,我在从innodb表中删除数据时遇到一些问题,据我所知,大多数人都说,释放空间的唯一方法是导出所需的数据创建一个新的故事并导入它。。这似乎是一种非常垃圾的做法,尤其是在数据量接近3TB的情况下 我遇到的问题是删除超过3个月的数据以尝试释放磁盘空间,一旦数据被删除,磁盘空间似乎不会被释放。是否有办法清除或永久删除行/数据以释放磁盘空间 是否有一种更可靠的方法,可以在不删除数据库和重新启动服务的情况下释放磁盘空间 请告诉我处理大型数据库删除的最佳方法 非常感谢您在高级课程中的时间 谢谢:)即使您使用

我在从innodb表中删除数据时遇到一些问题,据我所知,大多数人都说,释放空间的唯一方法是导出所需的数据创建一个新的故事并导入它。。这似乎是一种非常垃圾的做法,尤其是在数据量接近3TB的情况下

我遇到的问题是删除超过3个月的数据以尝试释放磁盘空间,一旦数据被删除,磁盘空间似乎不会被释放。是否有办法清除或永久删除行/数据以释放磁盘空间

是否有一种更可靠的方法,可以在不删除数据库和重新启动服务的情况下释放磁盘空间

请告诉我处理大型数据库删除的最佳方法

非常感谢您在高级课程中的时间


谢谢:)

即使您使用
文件/表格
选项,您仍然会遇到此问题。“修复”它的唯一方法是重建各个表:

OPTIMIZE TABLE bloated_table
请注意,这将在重建操作期间锁定表,并且您必须有足够的可用空间来容纳新表。在某些系统上,这是不切实际的

如果经常删除数据,可能需要定期旋转整个表。在InnoDB下放置一个带有
每个表的文件
的表几乎可以立即释放磁盘空间。如果每个月有一个表,您可以简单地删除表示三个月前数据的表


和这些一起工作难看吗?对还有别的选择吗?不是真的。您可以尝试进入兔子洞,但这往往会带来更多的麻烦。

即使您使用
文件/表格
选项,您仍然会遇到此问题。“修复”它的唯一方法是重建各个表:

OPTIMIZE TABLE bloated_table
请注意,这将在重建操作期间锁定表,并且您必须有足够的可用空间来容纳新表。在某些系统上,这是不切实际的

如果经常删除数据,可能需要定期旋转整个表。在InnoDB下放置一个带有
每个表的文件
的表几乎可以立即释放磁盘空间。如果每个月有一个表,您可以简单地删除表示三个月前数据的表


和这些一起工作难看吗?对还有别的选择吗?不是真的。你可以试着从兔子洞里钻出来,但那往往会带来更多的麻烦。

一种相对有效的方法是通过删除分区来使用和删除旧数据。它当然需要更复杂的维护,但它确实有效

首先,启用innodb_file_per_table,以便每个表(和分区)都指向自己的文件,而不是单个巨大的ibdata文件

然后,创建一个分区表,每个时间范围(天、月、周,由您选择)有一个分区,这将为您的数据集生成一些大小合理的文件

create table foo(     
        tid INT(7) UNSIGNED NOT NULL,
        yearmonth INT(6) UNSIGNED NOT NULL,
        data varbinary(255) NOT NULL,
        PRIMARY KEY (tid, yearmonth) 
) engine=InnoDB
PARTITION BY RANGE(yearmonth) (
        PARTITION p201304 VALUES LESS THAN (201304),
        PARTITION p201305 VALUES LESS THAN (201305),
        PARTITION p201306 VALUES LESS THAN (201306)
);
在数据库数据目录中可以找到每个分区的一个文件。在此示例中,分区“p201304”将包含yearmonth<201304的所有行,“p201305”将包含2013-04的行,“p201306”将包含2013-05的所有行

实际上,我使用了一个包含UNIX时间戳的整数列作为分区键,这样随着时间的推移调整分区的大小就更容易了。分区边缘不需要匹配任何日历边界,它们可以每100000秒发生一次,或者任何结果都会产生相当数量的分区(数十个分区),同时数据中的文件仍然足够小

然后,设置为新数据创建新分区的维护过程:
ALTER TABLE foo ADD PARTITION(分区p201307的值小于(201307))
并删除旧分区:
ALTER TABLE foo DROP PARTITION p201304
。删除一个大分区的速度几乎和删除文件的速度一样快,而且它实际上会释放磁盘空间。而且,它不会因为在其他分区中留下零散的空白空间而将它们分割成碎片


如果可能,通过指定分区键(上例中的yearmonth)或其范围,确保频繁查询只访问一个或几个分区,在WHERE子句中-这将使它们运行得更快,因为数据库不需要在所有分区中查找数据。

一种相对有效的方法是通过删除分区来使用和删除旧数据。它当然需要更复杂的维护,但它确实有效

首先,启用innodb_file_per_table,以便每个表(和分区)都指向自己的文件,而不是单个巨大的ibdata文件

然后,创建一个分区表,每个时间范围(天、月、周,由您选择)有一个分区,这将为您的数据集生成一些大小合理的文件

create table foo(     
        tid INT(7) UNSIGNED NOT NULL,
        yearmonth INT(6) UNSIGNED NOT NULL,
        data varbinary(255) NOT NULL,
        PRIMARY KEY (tid, yearmonth) 
) engine=InnoDB
PARTITION BY RANGE(yearmonth) (
        PARTITION p201304 VALUES LESS THAN (201304),
        PARTITION p201305 VALUES LESS THAN (201305),
        PARTITION p201306 VALUES LESS THAN (201306)
);
在数据库数据目录中可以找到每个分区的一个文件。在此示例中,分区“p201304”将包含yearmonth<201304的所有行,“p201305”将包含2013-04的行,“p201306”将包含2013-05的所有行

实际上,我使用了一个包含UNIX时间戳的整数列作为分区键,这样随着时间的推移调整分区的大小就更容易了。分区边缘不需要匹配任何日历边界,它们可以每100000秒发生一次,或者任何结果都会产生相当数量的分区(数十个分区),同时数据中的文件仍然足够小

然后,设置为新数据创建新分区的维护过程:
ALTER TABLE foo ADD PARTITION(分区p201307的值小于(201307))
并删除旧分区:
ALTER TABLE foo DROP PARTITION p201304
。删除一个大分区的速度几乎和删除文件的速度一样快,而且它实际上会释放磁盘空间。而且,它不会通过离开emp来分割其他分区