在MySQL中加载一个表是非常慢的

时间:2011-04-30 17:02:57

标签: mysql

清除数据库中的所有其他表按预期工作,并在几分之一秒内加载〜200万行。只有约600行的一个表需要10分钟才能加载到navcat中。

我想不出任何可能的原因。只有4列。其中一个 是一个大文本字段,但之前我曾经使用过大文本字段而且从来没有这么慢过。

正在运行explain select * from parser_queue

 id  setect type  table     type  possible keys  key  key len  ref  rows  extra
 1   SIMPLE    parser_queue  ALL  -              -    -        -    658   - 

该配置文件告诉我“发送数据”花了453秒 我也在“状态”标签中找到了这个。我不了解其中的大部分,但这些数字比我的其他表格要高得多。

Bytes_received            31
Bytes_sent                32265951
Com_select                1
Created_tmp_files         16
Handler_read_rnd_next     659
Key_read_requests         9018487
Key_reads                 3928
Key_write_requests        310431
Key_writes                4290
Qcache_hits               135077
Qcache_inserts            14289
Qcache_lowmem_prunes      4133
Qcache_queries_in_cache   983
Questions                 1
Select_scan               1
Table_locks_immediate     31514

存储在文本字段中的数据平均约为12000个字符。 主要的自动增量int ID字段,tinyint状态字段,text字段和带有timestamp的{​​{1}}字段。


好的我会尝试两个答案,但我可以先快速回答问题:

ID字段上的主键是唯一的键。此表用于排队,每小时添加/删除约50条记录,但我昨天才创建它。它会在如此短的时间内被破坏吗?

是MyISAM


尝试隔离问题的更多工作:

on update current timestamp什么也没做 repair table什么也没做 创建了临时表。查询在临时表上慢了约50%。

删除了表格并重建了它。只需 4行optimize table需要18秒。

这是我用来创建表的SQL:

SELECT *

更奇怪的是,我的本地盒子上的一切似乎都很好。缓慢只发生在开发站点上。

为清楚起见:开发网站上有超过100个表格,而只有一个是时髦的。


好的我已禁用所有使用此表的cron作业。 CREATE TABLE IF NOT EXISTS `parser_queue` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `status` tinyint(4) NOT NULL DEFAULT '1', `data` text NOT NULL, `last_updated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) ENGINE=MyISAM; 没有在桌面上显示任何锁定。

将引擎更改为SHOW PROCESSLIST并未产生任何显着改善(86秒对MyISAM为94)

还有其他想法吗? 。 。

在查询期间运行InnoDB会显示它花费大部分时间SHOW PROCESSLIST

3 个答案:

答案 0 :(得分:2)

如果您怀疑某处存在腐败,可以尝试以下任一项(或两项):

CREATE TABLE temp SELECT * FROM parser_queue;

这将创建一个与前一个“相同”的新表,除了它将被重新创建。或者(或者在您制作副本之后),您可以尝试:

REPAIR TABLE parser_queue;

您可能还想尝试优化表格;它可能已经碎片化,因为你将它用作队列。

OPTIMIZE TABLE parser_queue;

您可以通过运行SHOW TABLE STATUS LIKE 'Data_Free'来判断该表是否已分段,并查看是否会产生较高的数字。

<强>更新

您说您正在gzcompress列中存储TEXT个ed数据。请尝试将TEXT列更改为BLOB,以便处理二进制数据,例如压缩文本。

答案 1 :(得分:1)

该名称表示您正在使用该表进行排队(许多插入和删除,可能?)。也许你已经把桌子放了一段时间,它的碎片非常分散。如果我的假设是正确的,请尝试OPTIMIZE TABLE parser_queue;

您可以在手册中阅读更多相关信息: http://dev.mysql.com/doc/refman/5.1/en/optimize-table.html

答案 2 :(得分:1)

是的,问题似乎只是这样:text字段太大了。

正在运行

 SELECT id, status, last_updated FROM parser_queue

花费的时间少于

 SELECT data FROM parser_queue WHERE id = 6

由于我将运行的所有查询只返回一行,因此减速不会对我产生太大影响。我已经在存储的数据上使用了gzcompress,所以我认为无论如何我还能做更多的事情。