"Невозможно, ГДЕ замечено..." с MySQL INNER JOIN на столбцах LONGTEXT. Опции?
Я исследую медленно выполняющийся SQL-запрос к производственной базе данных MySQL и ищу варианты повышения производительности. Я не проектировал и не реализовывал это, но мне нужно это исправить.
Предполагаемая цель SQL - проверить, был ли ранее вставлен тот же самый пакет данных, и если да, вернуть идентификаторы этих ранее вставленных строк, чтобы вставленные данные не были дубликатами. Он пытается сделать это с помощью INNER JOIN на себя через столбец LONGTEXT 'datapacket' (который содержит до 60000 символов данных JSON). В настоящее время в этой таблице содержится около 1 миллиона записей, каждый раз для выполнения 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'
Когда я запускаю EXPLAIN для SQL, я получаю..."Невозможно ГДЕ заметил после прочтения const таблиц".
Итак, мои вопросы:
Всегда ли этот SQL возвращает пустой набор записей в соответствии с "EXPLAIN", и, следовательно, является полной тратой системного времени и ресурсов?
Является ли преобразование LONGTEXT в VARCHAR(65000) с INDEX на первые 20 символов (которые содержат уникальный идентификатор пакета данных) жизнеспособной альтернативой?