Database: Un ottimizzazione che riduce 99% del tempo la tua query

Questo è una piccola esperimento che mi è successo su una query tra due tabelle in MariaDB.

IDcampo_a
1A
2B
Tabella A
IDcolumnStringWithId
1DDD_1
Tabella B

La query che ho creato serviva per controllare che nella tabella A non ci fossero nessun elemento che nella tabella B non comparisse.

Per il formato che mi trovavo nella tabella B, sapevo che avevo quel id nella stringa della colonna columnStringWithId, con un formato ben preciso.

Quindi ho generato la query seguente:

select * from table_A where id not in (
	select RIGHT(table_B.columnStringWithId,(LENGTH(table_B.columnStringWithId)-LENGTH('DDD_')) from table_B
	)

E ho lanciato. Inizia a macinare e vedo che impegna moltissimi secondi.
Allora lo stoppo e cerco di capire meglio. All’inizio opto per eseguirla in diverse parti, ma anche li era molto lenta.

Sapendo che erano tutti interi quelli che stavo cercando di prendere dalla tabella B, parlando con il mio collega, mi è sorto il dubbio che, dopo aver preso da una stringa, il dato non fosse considerato come intero, ma ancora come stringa.

Allora ho fatto una prova aggiungendo il cast (MariaDb doc) alla colonna generata e la seguente query ci ha messo fino al 85% in meno.

select * from table_A where id not in (
	select CAST(RIGHT(table_B.columnStringWithId,(LENGTH(table_B.columnStringWithId)-LENGTH('DDD_')) AS INTEGER) from table_B
	)

In locale questa erano le due query e il risultato:

La query senza CAST

La query con CAST

Per simularlo ho inserito circa 100k record nella tabella NewTable, invece per la NewTable_1 ho inserito 10k record.

Conclusione

A volte ci sono delle ottimizzazione che diamo per scontato che il database le stia facendo, mentre le dobbiamo inserire noi a mano perchè sappiamo che si possono fare, ma il DB automaticamente non può dedurre che quella strada sia giusta.