由于需要使用 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 的块中(...第一个 ? 是用户的主要电子邮件,第二个 ? 是用户的辅助电子邮件。
基本上,此查询所做的是返回 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 条记录,因此查询最多需要 30 秒,因为它需要对状态表中的每个加密电子邮件行运行 convert/AES_DECRYPT。关于优化这个的方法有什么想法吗?我不是 SQL 专业人士。