I have this class name: Maybe it is the
class Follower(models.Model):
language = models.ManyToManyField(
"instagram_data.Language", verbose_name=_("language_code_name"), blank=True)
class Language(models.Model):
code_name = models.CharField(max_length=6, null=True, blank=True)
def __str__(self):
return self.code_name
While searching for specific name it return values fast (few sec), (i.g Follower_obj.language.code_name = "he"): he lang
While adding the check for Follower_obj.language.code_name != "ar", it can take few minutes !
Maybe design issue ?
EDIT: Running Explain: So I first minimized the queryset by filter _is_verified than run the slow language check:
qs1 = Follower.objects.filter(Q(is_verified=True))
print(qs1.explain())
qs2 = qs1.filter(~Q(language__code_name='ar'))
print(qs2.explain())
Gather (cost=1000.00..1216249.91 rows=7960 width=979)
Workers Planned: 2
-> Parallel Seq Scan on instagram_data_follower (cost=0.00..1214453.91 rows=3317 width=979)
Filter: is_verified
Gather (cost=6135.18..92362779347.15 rows=3980 width=979)
Workers Planned: 2
-> Parallel Seq Scan on instagram_data_follower (cost=5135.18..92362777949.15 rows=1658 width=979)
Filter: (is_verified AND (NOT (SubPlan 1)))
SubPlan 1
-> Materialize (cost=5135.18..56725.50 rows=157291 width=4)
-> Nested Loop (cost=5135.18..55324.05 rows=157291 width=4)
-> Seq Scan on instagram_data_language u2 (cost=0.00..1.64 rows=1 width=4)
Filter: ((code_name)::text = 'ar'::text)
-> Bitmap Heap Scan on instagram_data_follower_language u1 (cost=5135.18..53615.64 rows=170677 width=8)
Recheck Cond: (language_id = u2.id)
SQL EXECUTED:
SELECT * FROM "instagram_data_follower" WHERE NOT ("instagram_data_follower"."id" IN (SELECT U1."follower_id" FROM "instagram_data_follower_language" U1 INNER JOIN "instagram_data_language" U2 ON (U1."language_id" = U2."id") WHERE U2."code_name" = ar)))
What am I see here?
EDIT:
Lookup is faster by searching id in Follower instead of char. but still not fast as I want it to be. Not sure what "not-equal" best design optimization is.