请教下:现在公司用的mysql数据库,里面有个记录表,大概有几千万条记录,保留了04年以来的消费记录。现在决定只保留08年以来的,现在需要删除08年以前的消费记录,大概也是几千万条。该表的每条记录都是有提交时间字段,datetime格式。假设表名为a,时间字段为time我现在想用delete from a where time < "2008-01-01 00:00:00";担心几千万条的记录要删除很久,不知道有没有其他好的方法。

解决方案 »

  1.   

    给TIME字段加一个索引就可以了
      

  2.   

    谢谢你的回复,
    我忘记说明,time字段已经是主键了。这样是不是就可以了?没有其他更简单的方法了吧
      

  3.   

    或者你select一下你delete的条件,看看时间可不可以接受。
      

  4.   

    explain select * from   a   where   time   <   "2008-01-01   00:00:00"; 
    结果
      

  5.   

    将08年之后的数据导出,然后清空表,再将之前导出的数据导入。如果要求数据库不能离线的话,就花些时间delete吧
      

  6.   

    truncate table 几乎是瞬间的。
      

  7.   

    如果想要删除一个表的所有行,使用TRUNCATE TABLE tbl_name 而不要用DELETE FROM tbl_name
      

  8.   

    +----------+-------+---------------+---------+---------+------+---------+-------------+
    | table    | type  | possible_keys | key     | key_len | ref  | rows    | Extra       |
    +----------+-------+---------------+---------+---------+------+---------+-------------+
    | Credited | range | PRIMARY       | PRIMARY |       8 | NULL | 7959324 | Using where |
    +----------+-------+---------------+---------+---------+------+---------+-------------+
    我用EXPLAIN显示的结果,看来是已经比较优化了。由于我只是删除该表里的部分数据,所以TRUNCATE   TABLE   tbl_name   不能使用,那会导致现有数据丢失。另外关于先备份数据,然后删除该表,然后导入新的数据的思路
    也存在一点遗憾,因为这个是生成数据库,每时都需要插入新的数据,而这个方法需要暂停下数据库,比较麻烦。最后决定Delete吧,谢谢各位了。
      

  9.   

    5482310 rows affected (21 min 27.14 sec)给大家一个参考数据,呵呵