Skip to content

Commit e0df6b4

Browse files
authored
Remove indexes that aren't used and that are large (#11623)
I ran some queries in prod to see what indexes weren't being used sorted by size. These are the biggest ones without many queries hitting them. Required updating django-simple-history to get the no_db_index.
1 parent af79b77 commit e0df6b4

File tree

9 files changed

+167
-7
lines changed

9 files changed

+167
-7
lines changed
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# Generated by Django 4.2.17 on 2025-02-18 21:38
2+
3+
from django.db import migrations, models
4+
from django_safemigrate import Safe
5+
6+
class Migration(migrations.Migration):
7+
safe = Safe.before_deploy
8+
9+
dependencies = [
10+
('builds', '0060_alter_version_slug'),
11+
]
12+
13+
operations = [
14+
migrations.AlterIndexTogether(
15+
name='build',
16+
index_together={('version', 'state', 'type'), ('version', 'state', 'date', 'success')},
17+
),
18+
migrations.AlterField(
19+
model_name='version',
20+
name='type',
21+
field=models.CharField(choices=[('branch', 'Branch'), ('tag', 'Tag'), ('external', 'External'), ('unknown', 'Unknown')], db_index=True, default='unknown', max_length=20, verbose_name='Type'),
22+
),
23+
]

readthedocs/builds/models.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ class Version(TimeStampedModel):
9999
max_length=20,
100100
choices=VERSION_TYPES,
101101
default="unknown",
102+
db_index=True,
102103
)
103104
# used by the vcs backend
104105

@@ -764,7 +765,6 @@ class Meta:
764765
# Query: ``version.builds.filter(success=True, state=BUILD_STATE_FINISHED)``
765766
["version", "state", "date", "success"],
766767
["version", "state", "type"],
767-
["date", "id"],
768768
]
769769
indexes = [
770770
models.Index(fields=["project", "date"]),

readthedocs/core/history.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
import structlog
21
from functools import partial
32

3+
import structlog
44
from django import forms
55
from django.db import models
66
from django.utils.translation import gettext_lazy as _
@@ -66,13 +66,11 @@ class ExtraFieldsHistoricalModel(models.Model):
6666
_("ID"),
6767
blank=True,
6868
null=True,
69-
db_index=True,
7069
)
7170
extra_history_user_username = models.CharField(
7271
_("username"),
7372
max_length=150,
7473
null=True,
75-
db_index=True,
7674
)
7775
extra_history_ip = models.CharField(
7876
_("IP address"),
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
# Generated by Django 4.2.17 on 2025-02-18 21:38
2+
3+
from django.db import migrations, models
4+
from django_safemigrate import Safe
5+
6+
class Migration(migrations.Migration):
7+
safe = Safe.before_deploy
8+
9+
dependencies = [
10+
('core', '0016_update_dj_simple_history'),
11+
]
12+
13+
operations = [
14+
migrations.AlterField(
15+
model_name='historicaluser',
16+
name='extra_history_user_id',
17+
field=models.IntegerField(blank=True, null=True, verbose_name='ID'),
18+
),
19+
migrations.AlterField(
20+
model_name='historicaluser',
21+
name='extra_history_user_username',
22+
field=models.CharField(max_length=150, null=True, verbose_name='username'),
23+
),
24+
migrations.AlterField(
25+
model_name='historicaluserprofile',
26+
name='extra_history_user_id',
27+
field=models.IntegerField(blank=True, null=True, verbose_name='ID'),
28+
),
29+
migrations.AlterField(
30+
model_name='historicaluserprofile',
31+
name='extra_history_user_username',
32+
field=models.CharField(max_length=150, null=True, verbose_name='username'),
33+
),
34+
]
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# Generated by Django 4.2.17 on 2025-02-18 21:38
2+
3+
from django.db import migrations, models
4+
from django_safemigrate import Safe
5+
6+
class Migration(migrations.Migration):
7+
safe = Safe.before_deploy
8+
9+
dependencies = [
10+
('oauth', '0016_deprecate_old_vcs'),
11+
]
12+
13+
operations = [
14+
migrations.AlterField(
15+
model_name='remoterepository',
16+
name='remote_id',
17+
field=models.CharField(max_length=128),
18+
),
19+
]

readthedocs/oauth/models.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ class RemoteRepository(TimeStampedModel):
171171
blank=True,
172172
)
173173
# VCS provider repository id
174-
remote_id = models.CharField(db_index=True, max_length=128)
174+
remote_id = models.CharField(max_length=128)
175175
vcs_provider = models.CharField(
176176
_("VCS provider"), choices=VCS_PROVIDER_CHOICES, max_length=32
177177
)
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
# Generated by Django 4.2.17 on 2025-02-18 21:38
2+
3+
from django.db import migrations, models
4+
from django_safemigrate import Safe
5+
6+
class Migration(migrations.Migration):
7+
safe = Safe.before_deploy
8+
9+
dependencies = [
10+
('organizations', '0014_update_dj_simple_history'),
11+
]
12+
13+
operations = [
14+
migrations.AlterField(
15+
model_name='historicalorganization',
16+
name='extra_history_user_id',
17+
field=models.IntegerField(blank=True, null=True, verbose_name='ID'),
18+
),
19+
migrations.AlterField(
20+
model_name='historicalorganization',
21+
name='extra_history_user_username',
22+
field=models.CharField(max_length=150, null=True, verbose_name='username'),
23+
),
24+
migrations.AlterField(
25+
model_name='historicalteam',
26+
name='extra_history_user_id',
27+
field=models.IntegerField(blank=True, null=True, verbose_name='ID'),
28+
),
29+
migrations.AlterField(
30+
model_name='historicalteam',
31+
name='extra_history_user_username',
32+
field=models.CharField(max_length=150, null=True, verbose_name='username'),
33+
),
34+
]
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
# Generated by Django 4.2.17 on 2025-02-18 21:38
2+
3+
from django.db import migrations, models
4+
import readthedocs.projects.validators
5+
from django_safemigrate import Safe
6+
7+
8+
class Migration(migrations.Migration):
9+
safe = Safe.before_deploy
10+
11+
dependencies = [
12+
('projects', '0146_addons_filetreediff_ignored_files'),
13+
]
14+
15+
operations = [
16+
migrations.AlterField(
17+
model_name='historicaladdonsconfig',
18+
name='extra_history_user_id',
19+
field=models.IntegerField(blank=True, null=True, verbose_name='ID'),
20+
),
21+
migrations.AlterField(
22+
model_name='historicaladdonsconfig',
23+
name='extra_history_user_username',
24+
field=models.CharField(max_length=150, null=True, verbose_name='username'),
25+
),
26+
migrations.AlterField(
27+
model_name='historicalproject',
28+
name='extra_history_user_id',
29+
field=models.IntegerField(blank=True, null=True, verbose_name='ID'),
30+
),
31+
migrations.AlterField(
32+
model_name='historicalproject',
33+
name='extra_history_user_username',
34+
field=models.CharField(max_length=150, null=True, verbose_name='username'),
35+
),
36+
migrations.AlterField(
37+
model_name='historicalproject',
38+
name='repo',
39+
field=models.CharField(help_text='Git repository URL', max_length=255, validators=[readthedocs.projects.validators.RepositoryURLValidator()], verbose_name='Repository URL'),
40+
),
41+
migrations.AlterField(
42+
model_name='historicalproject',
43+
name='slug',
44+
field=models.SlugField(db_index=False, max_length=63, verbose_name='Slug'),
45+
),
46+
migrations.AlterField(
47+
model_name='project',
48+
name='repo',
49+
field=models.CharField(help_text='Git repository URL', max_length=255, validators=[readthedocs.projects.validators.RepositoryURLValidator()], verbose_name='Repository URL'),
50+
),
51+
]

readthedocs/projects/models.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -309,7 +309,6 @@ class Project(models.Model):
309309
max_length=255,
310310
validators=[validate_repository_url],
311311
help_text=_("Git repository URL"),
312-
db_index=True,
313312
)
314313

315314
# NOTE: this field is going to be completely removed soon.
@@ -586,7 +585,9 @@ class Project(models.Model):
586585
)
587586

588587
tags = TaggableManager(blank=True, ordering=["name"])
589-
history = ExtraHistoricalRecords()
588+
history = ExtraHistoricalRecords(
589+
no_db_index=["repo", "slug", "remote_repository_id", "main_language_project_id"]
590+
)
590591
objects = ProjectQuerySet.as_manager()
591592

592593
remote_repository = models.ForeignKey(

0 commit comments

Comments
 (0)