由于LONGTEXT
字段,我遇到了问题。一切正常,但是当执行SELECT查询并且其中包含任何WHERE子句时,mysql将进入休眠状态并且永远不会返回。只有80k记录和显式WHERE比较工作正常。 (有些记录超过1M,很少有约700K,但其余的只有60到100KB)。
例如:
[HANGs]
SELECT * FROM item_info
WHERE added_on > '2013-02-14 19:40:05' AND added_on < '2013-02-15 19:40:05'
;which is like 2 rows only
[FINE]
SELECT * from item_info
WHERE item_id in (1, 10, 1000)
这是通常的行为吗?
这是架构:
CREATE TABLE `item_info` (
`item_id` bigint(20) NOT NULL AUTO_INCREMENT,
`title_md5` varchar(35) NOT NULL,
`original_document` longtext NOT NULL,
`added_on` datetime NOT NULL,
PRIMARY KEY (`item_id`),
UNIQUE KEY `md5_Unique` (`title_md5`)
) ENGINE=MyISAM AUTO_INCREMENT=87781 DEFAULT CHARSET=utf8 CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC;
有什么解决方案吗?或者我是否必须将longtext字段分成带有外键的新表?
答案 0 :(得分:5)
您正在使用MyISAM
表。 InnoDB
上没有对它们的限制;
MyISAM 始终从磁盘读取完整的行,即使SELECT中未查询某些字段。
架构似乎在item_id
上有索引但在added_on
上没有索引。
由于added_on
上没有索引,查询将生成全表扫描。在具有长行的MyISAM
表上进行全表扫描需要从磁盘读取批次数据。
在added_on
上添加索引会使查询速度提高很多,因为您只需要读取实际需要的表行。
答案 1 :(得分:0)
听起来很简单但如果可能升级你的MySQL版本,请尝试增加内存限制和最大执行时间。