4

本番環境の 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に気づきました」というメッセージが表示されます。

だから、私の質問は次のとおりです。

  1. この SQL は常に「EXPLAIN」に従って空のレコードセットを返すので、システム時間とリソースが完全に無駄になりますか?

  2. LONGTEXT を VARCHAR(65000) に変換し、最初の 20 文字 (一意のデータパケット ID を含む) に INDEX を付けることは実行可能な代替手段ですか?

4

0 に答える 0