#mysql
#mysql
Вопрос:
У меня есть две таблицы, скажем, employees и order, в обеих таблицах миллионы записей.
Select orders.*
from orders
INNER JOIN employees
on Employees.id = orders.employeeid
WHERE orders.type='daily'
and orders.date > Employees.registerDate
and orders.date < Employees.regiserDate Interval 60 Days
Приведенный выше запрос является грубым запросом, может быть синтаксическая ошибка, но это просто соображения.
Загрузка запроса занимает почти 60 секунд, любой орган знает, как я могу оптимизировать этот запрос
Комментарии:
1. похоже, вам нужны индексы на
e.id, o.employeeid, o.type, o.date and e.registerdate
2. Вам не приходило в голову, что для этого нам могут понадобиться ваши определения таблиц? что ж, мы делаем :). ответ «по умолчанию»: индексы. Индексируйте все, к чему вы присоединяетесь (например, поля ID) и прочее в вашем
WHERE
. Создайте объединенный индекс для всего необходимого, если скорость вставки // размер индекса не является проблемой, или вам нужно выполнить компиляцию. Кроме того, покажите нам свойexplain
вариант этого запроса.3. да, у меня уже есть индексы по идентификаторам и типу. но нет индекса по дате. итак, я должен индексировать обе даты в employee по порядку. или это что-то еще, что вызывает проблему.
4. Это ежедневный запрос? Вы можете создать таблицу, содержащую индексы, поэтому вам нужно только выбирать дату один раз в день. Но я не думаю, что это будет большой выигрыш.
5. Итак, у вас миллионы сотрудников? Вау…
Ответ №1:
Индексирование — один из лучших упомянутых вариантов, вы также можете использовать хранимую процедуру для оптимизации ее производительности при получении данных.
возможно, вы также захотите использовать оператор ANALYZE для оптимизации извлечения данных из этих таблиц. подробнее об этом заявлении вы можете прочитать на этом сайте:
Ответ №2:
Правильно настройте свои индексы (что вы, вероятно, и сделали?) Или создайте представления. Вы также можете рассмотреть временную таблицу, но в большинстве случаев синхронизация не стоит того.
Комментарии:
1. у обеих таблиц orders и employee есть индексы.
2. «создание представлений»: как это помогает?
3. Я думал об этом как об упрощенном представлении индексов, уменьшающем часть данных; но на самом деле, когда я использую некоторый ресурс, представления в MySQL для большой таблицы выглядят как убивающие производительность!
4. «Правильно установите свои индексы» — это не ответ на самом деле. Это более или менее то, что требуется. «Какие индексы находятся прямо здесь (или какой другой способ оптимизировать это)» может быть вопросом. Однако я не чувствую, что сегодня кто-то голосует против.