4

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

SQL 的预期目的是检查之前是否插入了相同的数据包,如果是,则返回那些之前插入的行的 ID,这样插入的数据就不会重复。它尝试通过 LONGTEXT 'datapacket' 列(最多包含 60,000 个字符的 JSON 数据)对自身进行 INNER JOIN 来执行此操作。目前这张表有接近100万条记录,SQL每次运行大约需要30-60s,这个查询每天运行几十万次。

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 表后注意到了不可能的 WHERE”。

所以,我的问题是:

  1. 这个 SQL 是否总是按照“解释”返回一个空记录集,因此完全浪费了系统时间和资源?

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

4

0 回答 0