Rails / mysql SUM отдельные записи - оптимизация - PullRequest
0 голосов
/ 04 апреля 2010

Эй. Как бы вы оптимизировали этот 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, если производительность выше. Должен ли я добавить какие-либо индексы, чтобы сделать это быстрее (у меня есть это по идентификаторам)?

1 Ответ

1 голос
/ 05 апреля 2010

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

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

...