清除数据库中的所有其他表按预期工作,并在几分之一秒内加载〜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
答案 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
,所以我认为无论如何我还能做更多的事情。