5

LONGTEXT由于字段,我遇到了问题。一切正常,但是当执行带有任何 WHERE 子句的 SELECT 查询时,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;

有什么解决办法吗?或者我是否必须使用外键将长文本字段分隔到一个新表中?

4

2 回答 2

5

您正在使用MyISAM表格。对它们有一个不存在的限制InnoDB

MyISAM总是从磁盘读取完整的行,即使某些字段没有在 SELECT 中查询。

架构似乎您有一个索引 onitem_id但没有 on added_on

由于您没有索引added_on,因此查询将生成全表扫描。对具有长行的表进行全表扫描MyISAM需要从磁盘读取大量数据。

添加索引added_on将大大加快您的查询速度,因为您只需要读取实际需要的表行。

于 2013-06-05T14:54:35.233 回答
0

听起来很简单,但如果可能的话,升级你的 MySQL 版本,尝试增加内存限制和最大执行时间。

于 2013-06-05T14:51:06.773 回答