Tällä viikolla ohjelmassa on ollut pientä pellin alla -korjausta ja taustajärjestelmien hienosäätöä. Tähän on kuulunut mm. MVC-frameworkin M-osion hienosäätöä ja samalla kun kirjoitin uudelleen SQL-kyselyjä, pysähdyin hetkeksi miettimään miten asiat kannattaa tehdä MySQL:n kanssa. Tarkoitus oli tehdä kyselyä joka hakee tietokannasta tietyn mallin rivit, ja näihin kuuluvat muiden taulujen rivit (1...N -suhde). Aloin tekemään ratkaisua käyttäen LEFT JOIN:ia, kunnes ihmettelin kun kysely kestää ja kestää ja kestää....

Teinkin pienen testin, ja kokeilin kumpi on nopeampaa, käyttää LEFT JOIN -kyselymuotoa vai tehdä useampi kysely. Tein tietokantaan kaksi taulua, taulu1 ja taulu2.

Vaihtoehto 1: LEFT JOIN

Datasource::query("select * from taulu1 left join taulu2 on taulu1.id=taulu2.taulu1_id");

Vaihtoehto 2: Ilman LEFT JOIN:ia

$rows = Datasource::query("select * from taulu1");
foreach($rows as $row) {
    Datasource::query("select * from taulu2 where " .
          "taulu1_id=" . $row["id"]);
}

Taulu1 -tauluun syötetään 1000 riviä, ja taulu2 -tauluun syötetään 100 riviä jokaista taulu1:n riviä kohden, eli yhteensä 100 000 riviä.

Lopputulos: LEFT JOIN on merkittävästi hitaampi. Kysellessä kaikki rivit, ero on jopa n. 30-kertainen. Rajatessa kyselyn kokoa esim. 10:een taulu1:n riviin (jolloin tulosjoukko on 1000 riviä), vaihtoehto 1 vie 7 sekuntia koneellani kun vaihtoehto 2 vie alle sekunnin.