AES_DECRYPT を他のトリッキーな状況と一緒に使用する必要があるため、長い時間がかかる非常にトリッキーな SQL クエリがあります。まず、クエリは次のとおりです。
SELECT
CONVERT( AES_DECRYPT( email, '$key' ) USING UTF8 ),
timestamp,
category,
status
FROM email_statuses
WHERE
timestamp IN (
SELECT MAX(timestamp)
FROM email_statuses
WHERE ( CONVERT( AES_DECRYPT( email, '$key' ) USING UTF8 ) = ?
OR CONVERT( AES_DECRYPT( email, '$key' ) USING UTF8 ) = ? )
AND category = 'EMAIL_TEMPLATE_01'
)
OR
timestamp IN (
SELECT MAX(timestamp)
FROM email_statuses
WHERE ( CONVERT( AES_DECRYPT( email, '$key' ) USING UTF8 ) = ?
OR CONVERT( AES_DECRYPT( email, '$key' ) USING UTF8 ) = ? )
AND category = 'EMAIL_TEMPLATE_02'
)
OR
timestamp IN (
SELECT MAX(timestamp)
FROM email_statuses
WHERE ( CONVERT( AES_DECRYPT( email, '$key' ) USING UTF8 ) = ?
OR CONVERT( AES_DECRYPT( email, '$key' ) USING UTF8 ) = ? )
AND category = 'EMAIL_TEMPLATE_03'
);
タイムスタンプ IN と表示されている各ブロックでは (... 最初の ? はユーザーのプライマリ メールであり、2 番目の ? はユーザーのセカンダリ メールです。
基本的に、このクエリが行うことは、3 つのメール (カテゴリ = メールの名前) のそれぞれの最新のステータスのリストを返すことです。そのユーザーのそれぞれの最新ステータスのみが必要です。たとえば、「email@domain.com」を使用したクエリの結果は次のようになります。
email---------------timestamp----------category-------------status---------
email@domain.com----0000-00-00 etc-----EMAIL_TEMPLATE_01----Sent
email@domain.com----0000-00-00 etc-----EMAIL_TEMPLATE_02----Open & click through
email@domain.com----0000-00-00 etc-----EMAIL_TEMPLATE_03----Open
現在、email_status テーブルのレコード数は 1000 を超えているため、ステータス テーブルのすべての暗号化された電子メール行に対して convert/AES_DECRYPT を実行する必要があるため、クエリに最大 30 秒かかります。これを最適化する方法について何か考えはありますか? 私は SQL の専門家ではありません。