'不可能在哪里注意到......'在LONGTEXT cols上使用MySQL INNER JOIN。选项?

时间:2016-01-12 21:10:49

标签: mysql innodb longtext

我正在调查生产mySQL数据库上运行缓慢的SQL查询,并寻找提高性能的选项。我没有设计或实现这个,但我确实需要解决它。

SQL的预期用途是检查先前是否已插入相同的数据包,如果是,则返回先前插入的行的ID,以便插入的数据不重复。它试图通过LONGTEXT' datapacket'在INNER JOIN上进行此操作。列(包含最多60,000个字符的JSON数据)。此表中目前有近100万条记录,每次运行SQL需要大约30-60秒,而且此查询每天运行数十万次。

CREATE TABLE `T_Upload` (
  `id`          int(11) NOT NULL AUTO_INCREMENT,
  `type`        varchar(30) NOT NULL,
  `datapacket`  longtext,
  `timestamp`   timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `idx_uploadtype` (`type`),
  KEY `idx_timestamp` (`timestamp`)
) ENGINE=InnoDB CHARSET=ascii;


EXPLAIN
SELECT priorDuplicate.id
FROM T_Upload u INNER JOIN T_Upload priorDuplicate ON priorDuplicate.files = u.files
                                               AND u.id > priorDuplicate.id 
WHERE u.id = 3277515 
AND u.type = 'mobile'

当我在SQL上运行EXPLAIN时,我得到......"不可能在阅读const表后注意到了#34;。

所以,我的问题是:

  1. 这个SQL总是按照' EXPLAIN'返回一个空的记录集,因此完全浪费系统时间&资源?

  2. 将LONGTEXT转换为带有前20个字符(包含唯一数据包ID)的INDEX的VARCHAR(65000)是否可行?

0 个答案:

没有答案