2014-01-09 18 views
0

我只是跑的形式,简单的删除查询:MySQL的 - 如何将大量的删除后刷新表

DELETE*FROM [db.table] WHERE id < [value]; 

这从数据库中删除约80万行(我已经归档的数据,并没有更需要它)。这个系统不断有数据以每秒大约20次插入的速度进入,现在数据库中又有数千个条目。

如果我运行一个查询(仅限于1000行)的排序下降,类似这样的:

SELECT*FROM [db.table] ORDER BY id DESC; 

我立即得到返回结果,但是如果我升序排列,这样的:

SELECT*FROM [db.table] ORDER BY id ASC; 

查询将在10分钟后超时。在我看来(这只是一个猜测),查询正在经历我最近删除的行的所有ID,并且永远不会获得最新的数据。那可能吗?

如何获得'排序ASC'查询的工作?我需要做某种刷新吗?谢谢

+0

您是否有该领域的索引? –

+0

是的,我相信它是BTREE的Index_type。这听起来是对的吗? – jteezy14

回答

1

考虑在大删除后运行MYSQL的optimize table

重新组织表数据和关联索引数据的物理存储,以减少访问表时的存储空间并提高I/O效率。对每个表进行的确切更改取决于该表使用的存储引擎。

文档浏览:http://dev.mysql.com/doc/refman/5.1/en/optimize-table.html

+0

我在sandbox中的数据库副本上运行了optimize命令。这返回了一条消息,表示“表不支持优化,而是重新创建+分析”。这是什么告诉我?谢谢。 – jteezy14

+0

这意味着你的表可能是innodb而不是MyISAM,而mySQL却试图以不同的方式优化你的表。 – bdf

0

我更喜欢用这种聪明的方式来重新设置自动递增值:

DELETE * FROM [db.table] WHERE id < [value], 
ALTER TABLE [db.table] AUTO_INCREMENT = [value]; 

顺便说一句,我总是设置一个无符号整数主要编号:

ALTER TABLE [db.table] CHANGE `id` `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT