База данных Azure для PostgreSQL гибкий сервер Slow с Django
Я использую Django для подключения к Azure Database for PostgreSQL flexible server
, но это очень медленно, ниже приведены характеристики сервера :
Вычисления + хранение данных
Pricing tier
Memory Optimized
Compute size
Standard_E4s_v3 (4 vCores, 32 GiB memory, 6400 max iops)
Storage
32 GiB
Высокая доступность :
High availability
Enabled
High availability mode
ZoneRedundant
Availability zone
2
Standby availability zone
1
Как вы можете видеть выше, характеристики высокие, но производительность не лучше, в postman, когда я нажимал, чтобы получить данные, требовалось 34.5 seconds
, это слишком много, чтобы ждать.
В моем коде Django я изо всех сил старался оптимизировать запросы, и на Heroku это было очень быстро, однако на Azure это происходит крайне медленно, что можно сделать, чтобы улучшить скорость сервера?
Для получения дополнительной информации о Django это view.py
конечная точка:
@method_decorator(cache_page(60 * 60 * 4), name='get')
@method_decorator(vary_on_cookie, name='get')
class PostList(generics.ListCreateAPIView):
"""Blog post lists"""
queryset = Post.objects.filter(status=APPROVED).select_related(
"owner", "grade_level", "feedback").prefetch_related(
"bookmarks", "likes", "comments",
"tags", "tags__following").prefetch_related("address_views")
serializer_class = serializers.PostSerializer
authentication_classes = (JWTAuthentication,)
permission_classes = (PostsProtectOrReadOnly, IsMentorOnly)
def filter_queryset(self, queryset):
ordering = self.request.GET.get("order_by", None)
author = self.request.GET.get("author", None)
search = self.request.GET.get("search", None)
tag = self.request.GET.get("tag", None)
# filter queryset with filter_backends 🖟
queryset = super().filter_queryset(queryset)
if ordering == 'blog_views':
queryset = queryset.annotate(
address_views_count=Count('address_views')).order_by(
'-address_views_count')
if author:
queryset = queryset.filter(owner__email=author).select_related(
"owner", "grade_level", "feedback").prefetch_related(
"bookmarks", "likes", "comments", "tags",
"tags__following").prefetch_related("address_views")
if tag:
queryset = queryset.filter(
tags__name__icontains=tag).select_related(
"owner", "grade_level", "feedback").prefetch_related(
"bookmarks", "likes", "comments", "tags",
"tags__following").prefetch_related("address_views")
if search:
queryset = queryset.annotate(
rank=SearchRank(SearchVector('title', 'body', 'description'),
SearchQuery(search))).filter(
rank__gte=SEARCH_VALUE).order_by('-rank')
return queryset
Тогда мой serializer.py
:
class PostSerializer(SoftDeletionSerializer):
"""Post Serializer"""
owner = UserProfile(read_only=True)
tags = TagSerializer(many=True)
comments = CommentSerializer(many=True, read_only=True)
slug = serializers.SlugField(read_only=True)
grade_level = GradeClassSerializer(many=False)
class Meta:
model = Post
fields = ('uuid', 'id', 'title', 'body', 'owner', 'slug', 'grade_level',
'comments', 'tags', 'description', 'image',
'created', 'modified', 'blog_views', 'blog_likes',
'blog_bookmarks', 'status',
'read_time', 'is_featured',)
readonly = ('id', 'status',) + SoftDeletionSerializer.Meta.fields
def to_representation(self, instance):
"""Overwrite to serialize extra fields in the response."""
representation = super(PostSerializer, self).to_representation(instance)
representation['has_bookmarked'] = self.has_bookmarked(instance)
representation['has_liked'] = self.has_liked(instance)
return representation
def has_liked(self, instance):
return self.context['request'].user in list(instance.likes.all())
def has_bookmarked(self, instance):
return self.context['request'].user in list(instance.bookmarks.all())
У меня settings.py
нет неиспользуемого промежуточного программного обеспечения или приложений, я очистил его, и я думаю, что проблема в базе данных, а не в коде.
Что может улучшить скорость работы гибкого сервера Azure Database for PostgreSQL flexible server?
Эта проблема с задержкой может быть вызвана различием регионов в Azure. Бэкэнд-сервис, который взаимодействует с базой данных, должен находиться в том же регионе.