Ik heb in MySQL 5.0 een probleem. Zie onderstaand scenario:
Tabel a is gevuld met 250.000 oplopende ID's. Tabellen b en c zijn gevuld met 150.000 waarden, die allemaal ook in a zitten.
De volgende query:
Als ik dit uitvoer op tabel b duurt dit een eeuwigheid, op tabel c is het zo klaar. Dat komt natuurlijk omdat je voor tabel b een VARCHAR gebruikt voor a_id.
Nu heb ik het probleem dat ik een VARCHAR moet gebruiken in tabel b, omdat deze gevuld wordt vanuit een externe applicatie die niet anders snapt.
Heeft iemand een suggestie hoe dit te versnellen op één of andere manier? Zelf dacht ik om tabel b zo aan te passen dat een trigger before-insert-on die waarde omzet naar een INT. Maar is er nog een andere (wellicht handigere) manier om toch snel dit soort queries te kunnen doen op tabel a en b?
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| CREATE TABLE a ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY ) ENGINE = MYISAM CREATE TABLE b ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, a_id VARCHAR(11) NOT NULL, INDEX (a_id) ) ENGINE = MYISAM CREATE TABLE c ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, a_id INT NOT NULL, INDEX (a_id) ) ENGINE = MYISAM |
Tabel a is gevuld met 250.000 oplopende ID's. Tabellen b en c zijn gevuld met 150.000 waarden, die allemaal ook in a zitten.
De volgende query:
SQL:
1
2
3
4
5
6
7
| SELECT * FROM a WHERE NOT EXISTS ( SELECT * FROM b WHERE a.id = b.a_id ) |
Als ik dit uitvoer op tabel b duurt dit een eeuwigheid, op tabel c is het zo klaar. Dat komt natuurlijk omdat je voor tabel b een VARCHAR gebruikt voor a_id.
Nu heb ik het probleem dat ik een VARCHAR moet gebruiken in tabel b, omdat deze gevuld wordt vanuit een externe applicatie die niet anders snapt.
Heeft iemand een suggestie hoe dit te versnellen op één of andere manier? Zelf dacht ik om tabel b zo aan te passen dat een trigger before-insert-on die waarde omzet naar een INT. Maar is er nog een andere (wellicht handigere) manier om toch snel dit soort queries te kunnen doen op tabel a en b?