Rails / mysql SUM отдельные записи - оптимизация

0

Эй. Как бы вы оптимизировали этот SQL

SELECT SUM(tmp.cost) FROM (
   SELECT DISTINCT clients.id as client, countries.credits_cost AS cost
   FROM countries
   INNER JOIN clients ON clients.country_id = countries.id
   INNER JOIN clients_groups ON clients_groups.client_id=clients.id
   WHERE clients_groups.group_id IN (1,2,3,4,5,6,7,8,9)
   GROUP BY clients.id
) AS tmp;

Я использую этот пример как часть моего проекта Ruby on Rails. Обратите внимание, что мой вложенный SQL (tmp) может иметь более 10 миллионных записей. Вы можете разделить это на большее количество SQL, если производительность будет лучше. Должен ли я добавлять какие-либо индексы, чтобы сделать это быстрее (у меня есть ID)?

  • 0
    Не могли бы вы объяснить, что должен делать этот запрос? Это очень странно, потому что A) DISTINCT clients.id, по-видимому, ничего не значит в этом контексте, и действительно, необходимость выбора clients.id совершенно не очевидна, и B) Вы группируете по clients.id, что означает, что вы стоимость будет получена только из первой страны, но нет заказа, поэтому вы, по сути, получите одну произвольную страну для каждого клиента ....
  • 0
    Внутренний SQL имеет атрибут DISTINCT для устранения всех дубликатов client.id. SQL работает, но я ищу предложения по оптимизации.
Теги:
query-optimization
ruby-on-rails-plugins

1 ответ

1
Лучший ответ

У вас должны быть индексы для всех внешних ключей, участвующих в этом коде SQL, например: clients_groups.client_id, clients.country_id, clients_groups.group_id

Однако, в основном Когда у вас есть такое количество записей, использование SQL-функций, таких как SUM() или COUNT(), может быть убийством по производительности Поэтому я предлагаю вам хранить кеш стоимости и обновлять ее при каждой транзакции, влияющей на стоимость.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню