Не зная, как выглядит схема, ваш первый шаг к EXPLAIN
этим подзапросам.Это должно показать вам, где база данных тратит время.Если индексов нет, вероятно, выполняется многократное сканирование всей таблицы.Если бы мне пришлось угадывать, я бы сказал, что t1.printed
и s3.dtDatePrinted
являются двумя наиболее важными для индексации, поскольку они отсеивают то, что уже было конвертировано.
Также все, что нужно вычислить, можетзаставить базу данных не использовать индекс.Например, звонки на номера RTRIM
и CAST
.Это говорит о том, что у вас есть грязные данные в новой базе данных.Обрежьте его навсегда, и посмотрите, как изменить t1.group на правильный тип.
year(s3.dtDatePrinted) = 1850
может обмануть оптимизатор, заставив его не использовать индекс для s3.dtDatePrinted
(EXPLAIN должна сообщить вам об этом).Похоже, это просто флаг, установленный вами, чтобы проверить, была ли строка уже преобразована, поэтому установите для нее определенную дату (например, 1850-01-01 00:00:00) и выполните конкретное совпадение (т.е.. s3.dtDatePrinted = "1850-01-01 00:00:00"
) и теперь это простой поиск по индексу.
Упрощение сравнения также поможет.По сути, здесь имеется отношение 1 к 1 между t1 и s3 (если t1 - настоящее имя новой таблицы, рассмотрим что-то более описательное).Таким образом, вместо того, чтобы сопоставлять каждый отдельный бит s3 с t1, просто задайте столбцу t1 ссылку на первичный ключ соответствующей строки s3.Тогда вам просто нужно проверить одну вещь.Если вы не можете изменить t1, вы можете использовать третью таблицу для отслеживания отображений t1 в s3.
После того, как вы это сделаете, все, что вам нужно сделать, это объединить, чтобы найти строки в s3, которые не находятся вt1.
SELECT s3.*
FROM s3
LEFT JOIN t1 ON t1.s3 = s3.id -- or whatever s3's primary key is
WHERE t1.s3 IS NULL