Как многие уже говорили, немного преждевременно разбивать вашу таблицу на более мелкие таблицы (горизонтальное разбиение или даже разбиение). Базы данных созданы для обработки таблиц такого размера, поэтому проблема с производительностью, вероятно, где-то еще.
Индексы - это первый шаг, похоже, вы это сделали. Для обработки БД с индексом должно быть 4 миллиона строк.
Во-вторых, проверьте количество запросов, которые вы выполняете. Вы можете сделать это с помощью чего-то вроде панели инструментов отладки django, и вы часто будете удивлены, как много ненужных запросов будет сделано.
Кэширование - это следующий шаг, используйте memcached для страниц или частей страниц, которые остаются неизменными для большинства пользователей. Здесь вы увидите самое большое повышение производительности при минимальных затратах.
Если вам действительно нужно разделить таблицы, последняя версия django (альфа-версия 1.2) может справиться с разделением (например, multi-db), и вы сможете написать решение для горизонтального разделения (postgres предлагает способ сделать это в db). Пожалуйста, не используйте жанр для разделения таблиц! выберите что-то, что вы никогда не будете менять, и что вы всегда будете знать при выполнении запроса. Как автор и разделить по первой букве фамилии или что-то. Это требует больших усилий и имеет ряд недостатков для базы данных, которая не особенно велика - вот почему большинство людей здесь советуют против этого!
[редактировать]
Я пропустил денормализацию! Поместите общее количество, суммы и т. Д. В таблицу, например, автора, чтобы предотвратить присоединения к общим запросам. Недостатком является то, что вы должны поддерживать его самостоятельно (пока django не добавит DenormalizedField). Я хотел бы взглянуть на это во время разработки для ясных, простых случаев или после того, как кеширование не помогло вам - но хорошо до разделения или горизонтального разбиения.