本番環境の mySQL データベースで実行速度が遅い SQL クエリを調査しており、パフォーマンスを改善するためのオプションを探しています。私はこれを設計または実装していませんが、修正する必要があります。
SQL の意図した目的は、同じデータパケットが以前に挿入されているかどうかを確認することです。挿入されている場合は、挿入されたデータが重複しないように、以前に挿入された行の ID を返します。これは、LONGTEXT 'datapacket' 列 (最大 60,000 文字の JSON データを含む) を介して、自身の INNER JOIN でこれを実行しようとします。現在、このテーブルには 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テーブルを読み取った後に不可能なWHEREに気づきました」というメッセージが表示されます。
だから、私の質問は次のとおりです。
この SQL は常に「EXPLAIN」に従って空のレコードセットを返すので、システム時間とリソースが完全に無駄になりますか?
LONGTEXT を VARCHAR(65000) に変換し、最初の 20 文字 (一意のデータパケット ID を含む) に INDEX を付けることは実行可能な代替手段ですか?