mysql delete删除记录数据库空间不减少问题解决方法

今天空间商告诉我数据库空间满了,检查了一下,发现网站用户行为记录数据表竟然占了20多MB。积累了半年了,该删除释放一下空间了。果断delete之后发现数据库空间竟然没少,虽然数据记录数是零。

原来这是因为删除操作后在数据文件中留下碎片所致。DELETE只是将数据标识位删除,并没有整理数据文件,当插入新数据后,会再次使用这些被置为删除标识的记录空间。另外实际操作过程中还发现这个问题还存在两种情况。

(1)当DELETE后面跟条件的时候,则就会出现这个问题。如:

delete from table_name where 条件

删除数据后,数据表占用的空间大小不会变。

(2)不跟条件直接delete的时候。如:

delete from table_name

清除了数据,同时数据表的空间也会变为0。

这就存在了一个问题,在网站的实际运行过程中。经常会存在这样的附带条件删除数据的操作行为。天长日久,这不就在数据库中浪费了很多的空间吗。这个时候我们该使用 OPTIMIZE TABLE 指令对表进行优化了。

如何使用 OPTIMIZE 以及在什么时候该使用 OPTIMIZE 指令呢?
 
命令语法:OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ...

最简单的:optimize table phpernote_article;
 
如果您已经删除了表的一大部分,或者如果您已经对含有可变长度行的表(含有VARCHAR, BLOB或TEXT列的表)进行了很多更改,则应使用 OPTIMIZE TABLE。被删除的记录被保持在链接清单中,后续的INSERT操作会重新使用旧的记录位置。您可以使用OPTIMIZE TABLE来重新 利用未使用的空间,并整理数据文件的碎片。
 
在多数的设置中,您根本不需要运行OPTIMIZE TABLE。即使您对可变长度的行进行了大量的更新,您也不需要经常运行,每周一次或每月一次即可,只对特定的表运行。
 
OPTIMIZE TABLE只对MyISAM, BDB和InnoDB表起作用。
 
注意,在OPTIMIZE TABLE运行过程中,MySQL会锁定表。因此,这个操作一定要在网站访问量较少的时间段进行。

TRUNCATE

其语法结构为:

TRUNCATE [TABLE] tbl_name

这里简单的给出个示例,

我想删除 friends 表中所有的记录,可以使用如下语句:

truncate table friends;

delete的效果有点像将mysql表中所有记录一条一条删除到删完,而truncate相当于保留mysql表的结构,重新创建了这个表,所有的状态都相当于新表,这样空间就减下来了。

好了,当然对于我们网站不可能使用truncate table来清除了,因这样之后所有数据都丢失了,这样肯定是不合理的清除了,我们必须使用delete来删除,然后再来修复优化表了哦。

时间: 2024-08-01 03:17:10

mysql delete删除记录数据库空间不减少问题解决方法的相关文章

mysql之delete删除记录后数据库大小不变_Mysql

当DELETE后面跟条件的时候,则就会出现这个问题 delete from table_name where 条件 删除数据后,数据表占用的空间大小不会变. 不跟条件直接delete的时候. delete from table_name 清除了数据,同时数据表的空间也会变为0 如果已经删除了表数据的很大一部分,或者有很多变化和变长表行(VARCHAR表,VARBINARY.BLOB或文本列)进行了更改,因为删除操作后在数据文件中留下碎片所致.DELETE只是将数据标识位删除,并没有整理数据文件,

gethibernatetemplate-getHibernateTemplate().delete()删除记录是报错

问题描述 getHibernateTemplate().delete()删除记录是报错 SpingMVC+Hibernate删除某一条数据库不存在的记录的时候,就会报错误: 13:55:38.206 [http-8080-2] ERROR org.hibernate.jdbc.AbstractBatcher - Exception executing batch: org.hibernate.StaleStateException: Batch update returned unexpecte

mysql delete 删除一条记录简单方法

mysql教程 删除一条记录简单方法,应该说是最简单的入门级的了,下面我们来看看如何利用mysql sql语句来删除一条记录吧. mysql>delete from 表名 where id=1; query ok, 这样就可以删除了, 如果你和php教程 mysql配置只要利用php连接到数据库教程再用php mysql_query("delete from 表名 where id=1");就可以删除了. <?php $con = mysql_connect("l

php mysql delete数据记录删除

操作时点击删除连接时就会会获取到当前条目的id然后程序获取到当前id进行删除操作. <?php教程        include("conn.php");               $query = "select * from new order by id desc";        $res = mysql教程_query($query);        while($rows =mysql_fetch_array($res)){       //将查

Oracle DELETE删除记录sql语句用法

  语法与其它的sql数据库教程是一样的,如下 DELETE FROM COURSES WHERE COURSE_DESIGNATER = 'Java110' 按条件比较复杂的操作方法 DELETE FROM CLASSCONVENINGS WHERE CLASSES_NUM_FK > 4 AND CLASS_CONVENE_DATE = TO_DATE('2006-02-15 00:00:00', 'YYYY-MM-DD HH24:MI:SS') AND CLASS_LOCATION_FK =

批量删除记录时如何实现全选方法总结_实用技巧

做大批量的数据删除时,如果有个全选按钮把多个页面上显示的记录全都选中删除那比一条条的删除要人性化得多,接下来说一说如何实现,其实网上一搜有好多文章都是说如何进行批量删除的,大体上可以分为两大类1:利用JS脚本实现全选.2:在服务器端实现全选 首先来说一说如何利用JS实现全选 往页面上拖一个GridView,设置好数据源,并为GridView添加一个模板列,往模板列里添加一个chekcbox,比如下面的代码 <asp:GridView ID="GridView1" runat=&q

mysql数据库主从同步的问题解决方法

查看从库的状态: mysql>show slave statusG; 其中Slave_IO_Running:Yes 表明同步IO是否在运行:Slave_SQL_Running:Yes 表明同步SQL是否在运行:Last_Error表明上次出错的内容. 今天碰到一条出错的SQL,内容如下: Last_Error: Error 'Duplicate entry '14772680-15′ for key 'PRIMARY" on query. Default database: 'xxxxxx

mysql error:#1062 Duplicate entry ‘***′ for key 1问题解决方法_Mysql

我将id的int类型改成了bigint就可以了,其实再改回来可能也会好了.可能是数据库备份的时候出现了错误. 开发的网站后台系统在测试过程中出现了这个问题: Invalid Query : Duplicate entry '127′ for key 1 SQL is : INSERT INTO `kq_news` (`Title`,`Author`,`Type`,`Content`,`IsDel`,`Adate`,`Range`,`Lang`) values ('捐款活动','yuanying'

sqlserver数据库最大Id冲突问题解决方法之一_MsSql

复制代码 代码如下: CREATE TABLE [dbo].[TbGuidTable]( [TableName] [varchar](50) NOT NULL, [KeyName] [varchar](20) NOT NULL, [KeyValue] [varchar](100) NOT NULL ) ON [PRIMARY] GO if exists (select * from dbo.sysobjects where id = object_id(N'PCreateGuid') and O