База данных MySQL содержит две таблицы: customer и custmomer_orders
Таблица customer содержит 80 миллионов записей и содержит 80 полей.Некоторые из них меня интересуют:
- Id (PK, int (10))
- Местоположение (varchar 255, обнуляемый).
- Registration_Date (DateTime,обнуляемый).Индексируется.
Таблица customer_orders содержит 40 миллионов записей и содержит только 3 поля:
- Id (PK, int (10))
- Customer_Id (int (10), FK для таблицы клиентов)
- Order_Date (DateTime, nullable)
Когда я запускаю такой запрос, он занимает ~ 800 секунды для выполнения и возвращает 40 миллионов записей:
SELECT o.*
FROM customer_orders o
LEFT JOIN customer c ON (c.Id = o.Customer_Id)
WHERE NOT (ISNULL(c.Location)) AND c.Registration_Date < '2018-01-01 00:00:00';
Машина с сервером MySQL имеет 32 ГБ ОЗУ, 28 ГБ выделено для MySQL.Версия MySQL: 5.6.39.
Нормально ли для MySQL выполнять такой запрос за такое количество времени для таблиц с таким количеством записей?Как улучшить производительность?
Обновление:
Таблица customer_orders не содержит важных данных, которые мы хотели бы сохранить.Это своего рода скопированная таблица с заказами, сделанными за последние 10 дней.Каждый день мы запускаем хранимую процедуру, которая удаляет заказы старше 10 дней в рамках транзакции.
В какой-то момент эта хранимая процедура заканчивалась тайм-аутом из-за неоптимизированного запроса и количестваЗаказы росли с каждым днем.Предыдущий запрос содержал также метод COUNT, который, я полагаю, превысил время ожидания.
Тем не менее, меня удивило, что MySQL может извлечь до 40 м записей с дополнительными условиями.