数据库
首页 > 数据库> > MySQL – LONGTEXT字段导致SELECT-WHERE语句中的挂起

MySQL – LONGTEXT字段导致SELECT-WHERE语句中的挂起

作者:互联网

由于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字段分隔为具有外键的新表?

解决方法:

您正在使用MyISAM表. InnoDB上没有对它们的限制;

MyISAM always reads the complete row from the disk, even if some fields are not queried in the SELECT.

架构看起来像是在item_id上有索引但在added_on上没有.

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

在added_on上添加索引会使查询速度提高很多,因为您只需要读取实际需要的表行.

标签:mysql,database,performance,longtext
来源: https://codeday.me/bug/20190520/1142352.html