我正在调查生产 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”。
所以,我的问题是:
这个 SQL 是否总是按照“解释”返回一个空记录集,因此完全浪费了系统时间和资源?
将 LONGTEXT 转换为 VARCHAR(65000) 并在前 20 个字符(包含唯一的数据包 ID)上有一个 INDEX 是否可行?