mysql - 在 MySQL 中加载一张表慢得离谱

标签 mysql

为清楚起见,数据库中的所有其他表均按预期工作,并在几分之一秒内加载约 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 字段和一个 timestamp 带有更新当前时间戳的字段。


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

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

MyISAM


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

修复表 什么也没做 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;

您可能还想尝试优化表格;它可能会变得支离 splinter ,因为您将它用作队列。

OPTIMIZE TABLE parser_queue;

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

更新

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

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

相关文章:

mysql - IN 子句中最高匹配的 ORDER 值

sql - 跨连接表获取多个计数

mysql - 初学者 SQL 查询有困难

php - WampServer 2.2E 上的 Joomla 1.5 加载缓慢,显示空白页面

mysql - 如果最后一条记录包含相同的值则更新,否则插入

Mysql 按特定时间间隔进行分组

php - (UPD) 在 yii 上不限制表格输入

php - 如何从Mysql数据库中获取时分格式的时间格式?

php - 如何根据条件向数组添加一些项目?

mysql - 如何创建一个子查询而不是联合查询