为了清楚起见,数据库中的所有其他表都按预期工作,并在几分之一秒内加载了约 200 万行。一张只有约 600 行的表在 navcat 中加载需要 10 多分钟。

我想不出任何可能的原因。只有 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 字段和一个带有 timestampon update current timestamp 字段。

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

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

它是 MyISAM

尝试隔离问题的更多工作:
repair table 什么也没做optimize table 什么也没做
创建了一个临时表。临时表上的查询慢了大约 50%。

删除表并重建它。 SELECT * 只需要 4 行就需要 18 秒。

这是我用来创建表的 SQL:
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;

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

为清楚起见:开发站点上有 100 多个表,这是唯一一个时髦的表。

好的,我已禁用所有使用此表的 cron 作业。 SHOW PROCESSLIST 不会显示表上的任何锁。

将引擎更改为 InnoDB 并没有产生任何显着的改进(86 秒对 MyISAM 的 94 秒)

还有其他想法吗? . . .

在查询期间运行 SHOW PROCESSLIST 显示它花费了大部分时间 writing to net

最佳答案

如果您怀疑某处损坏,您可以尝试以下任一(或两者):

CREATE TABLE temp SELECT * FROM parser_queue;

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

您可能还想尝试优化表;由于您将其用作队列,因此它可能已经碎片化。
OPTIMIZE TABLE parser_queue;

您可以通过运行 SHOW TABLE STATUS LIKE 'Data_Free' 来确定表是否碎片化,并查看这是否会产生高数字。

更新

您说您将 gzcompress ed 数据存储在 TEXT 列中。尝试将 TEXT 列改为 BLOB,这意味着处理二进制数据,例如压缩文本。

关于mysql - 在 MySQL 中加载一张表非常慢,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5843312/

10-14 15:18
查看更多