【问题标题】:MySQL - LONGTEXT field causes hang in SELECT-WHERE statementMySQL - LONGTEXT 字段导致在 SELECT-WHERE 语句中挂起
【发布时间】:2013-06-05 14:46:20
【问题描述】:

由于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;

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

【问题讨论】:

  • 这与longtext 没有任何关系,日期比较可能会很昂贵。
  • @DanielA.White 确实,但在这种情况下只有 88k 条记录
  • 听起来像是一个锁定问题。你在哪里执行查询?从一种语言还是从 SQL 命令行?我怀疑它与 LONGTEXT 或日期比较有什么关系。
  • 从 PHP 和 SQLYog 执行/测试....
  • 它不仅仅是“datetime”字段,还有其他简单的int字段,但结果是一样的……只有主键字段在Where查询中起作用……

标签: mysql database performance longtext


【解决方案1】:

您正在使用MyISAM 表。 InnoDB 上不存在对它们的限制;

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

架构似乎在item_id 上有索引,但在added_on 上没有。

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

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

【讨论】:

  • 不只是add_on,还有其他简单的字段,输出也一样慢...
  • 你建议我把它改成InnoDB吗?
  • 我认为InnoDBacid transaction 的专家;但仅以一种方式阅读,MyISAM 是最好的......
  • @RaheelHasan 因为整行读取,如果你有大行但只使用几个小字段,除非你索引好,否则 MyISAM 不是最好的。如果你的负载有一个索引良好的表以避免全表扫描,它可能会优于 InnoDB,但很少有很大的优势。修复整行读取是 closed as not a bug 并且 afaik 再也没有打开过。
  • @RaheelHasan 除了为您的搜索添加索引之外,另一个解决方案是(如上面链接的错误报告中所建议的)将 LONGTEXT 与 ID 放在一个单独的表中,与您需要做的表分开搜索。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-07
    • 2012-10-11
    • 1970-01-01
    • 2016-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-12
    相关资源
    最近更新 更多