Skip to content

Commit 71e0b65

Browse files
authored
fix: slow queries for account linking (#248)
* fix: account linking indexes * fix: version and changelog
1 parent 4b3e69f commit 71e0b65

File tree

6 files changed

+71
-1
lines changed

6 files changed

+71
-1
lines changed

CHANGELOG.md

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,24 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

88
## [Unreleased]
99

10+
## [8.0.1]
11+
12+
- Fixes slow queries for account linking
13+
14+
### Migration
15+
16+
```sql
17+
CREATE INDEX IF NOT EXISTS emailpassword_users_email_index ON emailpassword_users (app_id, email);
18+
CREATE INDEX IF NOT EXISTS emailpassword_user_to_tenant_email_index ON emailpassword_user_to_tenant (app_id, tenant_id, email);
19+
20+
CREATE INDEX IF NOT EXISTS passwordless_users_email_index ON passwordless_users (app_id, email);
21+
CREATE INDEX IF NOT EXISTS passwordless_users_phone_number_index ON passwordless_users (app_id, phone_number);
22+
CREATE INDEX IF NOT EXISTS passwordless_user_to_tenant_email_index ON passwordless_user_to_tenant (app_id, tenant_id, email);
23+
CREATE INDEX IF NOT EXISTS passwordless_user_to_tenant_phone_number_index ON passwordless_user_to_tenant (app_id, tenant_id, phone_number);
24+
25+
CREATE INDEX IF NOT EXISTS thirdparty_user_to_tenant_third_party_user_id_index ON thirdparty_user_to_tenant (app_id, tenant_id, third_party_id, third_party_user_id);
26+
```
27+
1028
## [8.0.0]
1129

1230
- Adds tables and queries for Bulk Import

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ plugins {
22
id 'java-library'
33
}
44

5-
version = "8.0.0"
5+
version = "8.0.1"
66

77
repositories {
88
mavenCentral()

src/main/java/io/supertokens/storage/postgresql/queries/EmailPasswordQueries.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,11 @@ static String getQueryToCreateUsersTable(Start start) {
6363
// @formatter:on
6464
}
6565

66+
static String getQueryToCreateEmailPasswordUsersEmailIndex(Start start) {
67+
return "CREATE INDEX emailpassword_users_email_index ON "
68+
+ Config.getConfig(start).getEmailPasswordUsersTable() + "(app_id, email);";
69+
}
70+
6671
static String getQueryToCreateEmailPasswordUserToTenantTable(Start start) {
6772
String schema = Config.getConfig(start).getTableSchema();
6873
String emailPasswordUserToTenantTable = Config.getConfig(start).getEmailPasswordUserToTenantTable();
@@ -84,6 +89,11 @@ static String getQueryToCreateEmailPasswordUserToTenantTable(Start start) {
8489
// @formatter:on
8590
}
8691

92+
static String getQueryToCreateEmailPasswordUserToTenantEmailIndex(Start start) {
93+
return "CREATE INDEX emailpassword_user_to_tenant_email_index ON "
94+
+ Config.getConfig(start).getEmailPasswordUserToTenantTable() + "(app_id, tenant_id, email);";
95+
}
96+
8797
static String getQueryToCreatePasswordResetTokensTable(Start start) {
8898
String schema = Config.getConfig(start).getTableSchema();
8999
String passwordResetTokensTable = Config.getConfig(start).getPasswordResetTokensTable();

src/main/java/io/supertokens/storage/postgresql/queries/GeneralQueries.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -389,12 +389,19 @@ public static void createTablesIfNotExists(Start start, Connection con) throws S
389389
if (!doesTableExists(start, con, Config.getConfig(start).getEmailPasswordUsersTable())) {
390390
getInstance(start).addState(CREATING_NEW_TABLE, null);
391391
update(con, EmailPasswordQueries.getQueryToCreateUsersTable(start), NO_OP_SETTER);
392+
393+
// index
394+
update(con, EmailPasswordQueries.getQueryToCreateEmailPasswordUsersEmailIndex(start), NO_OP_SETTER);
392395
}
393396

394397
if (!doesTableExists(start, con, Config.getConfig(start).getEmailPasswordUserToTenantTable())) {
395398
getInstance(start).addState(CREATING_NEW_TABLE, null);
396399
update(con, EmailPasswordQueries.getQueryToCreateEmailPasswordUserToTenantTable(start),
397400
NO_OP_SETTER);
401+
402+
// index
403+
update(con, EmailPasswordQueries.getQueryToCreateEmailPasswordUserToTenantEmailIndex(start),
404+
NO_OP_SETTER);
398405
}
399406

400407
if (!doesTableExists(start, con, Config.getConfig(start).getPasswordResetTokensTable())) {
@@ -432,6 +439,9 @@ public static void createTablesIfNotExists(Start start, Connection con) throws S
432439
if (!doesTableExists(start, con, Config.getConfig(start).getThirdPartyUserToTenantTable())) {
433440
getInstance(start).addState(CREATING_NEW_TABLE, null);
434441
update(con, ThirdPartyQueries.getQueryToCreateThirdPartyUserToTenantTable(start), NO_OP_SETTER);
442+
443+
// index
444+
update(con, ThirdPartyQueries.getQueryToCreateThirdPartyUserToTenantThirdPartyUserIdIndex(start), NO_OP_SETTER);
435445
}
436446

437447
if (!doesTableExists(start, con, Config.getConfig(start).getJWTSigningKeysTable())) {
@@ -451,12 +461,19 @@ public static void createTablesIfNotExists(Start start, Connection con) throws S
451461
update(con, getQueryToCreateUserIdAppIdIndexForUsersTable(start), NO_OP_SETTER);
452462
update(con, getQueryToCreateAppIdIndexForUsersTable(start), NO_OP_SETTER);
453463
update(con, getQueryToCreateTenantIdIndexForUsersTable(start), NO_OP_SETTER);
464+
465+
update(con, PasswordlessQueries.getQueryToCreatePasswordlessUsersEmailIndex(start), NO_OP_SETTER);
466+
update(con, PasswordlessQueries.getQueryToCreatePasswordlessUsersPhoneNumberIndex(start), NO_OP_SETTER);
454467
}
455468

456469
if (!doesTableExists(start, con, Config.getConfig(start).getPasswordlessUserToTenantTable())) {
457470
getInstance(start).addState(CREATING_NEW_TABLE, null);
458471
update(con, PasswordlessQueries.getQueryToCreatePasswordlessUserToTenantTable(start),
459472
NO_OP_SETTER);
473+
474+
// index
475+
update(con, PasswordlessQueries.getQueryToCreatePasswordlessUserToTenantEmailIndex(start), NO_OP_SETTER);
476+
update(con, PasswordlessQueries.getQueryToCreatePasswordlessUserToTenantPhoneNumberIndex(start), NO_OP_SETTER);
460477
}
461478

462479
if (!doesTableExists(start, con, Config.getConfig(start).getPasswordlessDevicesTable())) {

src/main/java/io/supertokens/storage/postgresql/queries/PasswordlessQueries.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,16 @@ public static String getQueryToCreateUsersTable(Start start) {
6666
+ ");";
6767
}
6868

69+
static String getQueryToCreatePasswordlessUsersEmailIndex(Start start) {
70+
return "CREATE INDEX passwordless_users_email_index ON "
71+
+ Config.getConfig(start).getPasswordlessUsersTable() + "(app_id, email);";
72+
}
73+
74+
static String getQueryToCreatePasswordlessUsersPhoneNumberIndex(Start start) {
75+
return "CREATE INDEX passwordless_users_phone_number_index ON "
76+
+ Config.getConfig(start).getPasswordlessUsersTable() + "(app_id, phone_number);";
77+
}
78+
6979
static String getQueryToCreatePasswordlessUserToTenantTable(Start start) {
7080
String schema = Config.getConfig(start).getTableSchema();
7181
String passwordlessUserToTenantTable = Config.getConfig(start).getPasswordlessUserToTenantTable();
@@ -90,6 +100,16 @@ static String getQueryToCreatePasswordlessUserToTenantTable(Start start) {
90100
// @formatter:on
91101
}
92102

103+
static String getQueryToCreatePasswordlessUserToTenantEmailIndex(Start start) {
104+
return "CREATE INDEX passwordless_user_to_tenant_email_index ON "
105+
+ Config.getConfig(start).getPasswordlessUserToTenantTable() + "(app_id, tenant_id, email);";
106+
}
107+
108+
static String getQueryToCreatePasswordlessUserToTenantPhoneNumberIndex(Start start) {
109+
return "CREATE INDEX passwordless_user_to_tenant_phone_number_index ON "
110+
+ Config.getConfig(start).getPasswordlessUserToTenantTable() + "(app_id, tenant_id, phone_number);";
111+
}
112+
93113
public static String getQueryToCreateDevicesTable(Start start) {
94114
String schema = Config.getConfig(start).getTableSchema();
95115
String devicesTable = Config.getConfig(start).getPasswordlessDevicesTable();

src/main/java/io/supertokens/storage/postgresql/queries/ThirdPartyQueries.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,11 @@ static String getQueryToCreateThirdPartyUserToTenantTable(Start start) {
9797
// @formatter:on
9898
}
9999

100+
static String getQueryToCreateThirdPartyUserToTenantThirdPartyUserIdIndex(Start start) {
101+
return "CREATE INDEX thirdparty_user_to_tenant_third_party_user_id_index ON "
102+
+ Config.getConfig(start).getThirdPartyUserToTenantTable() + "(app_id, tenant_id, third_party_id, third_party_user_id);";
103+
}
104+
100105
public static AuthRecipeUserInfo signUp(Start start, TenantIdentifier tenantIdentifier, String id, String email,
101106
LoginMethod.ThirdParty thirdParty, long timeJoined)
102107
throws StorageQueryException, StorageTransactionLogicException {

0 commit comments

Comments
 (0)