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