Tietokantakyselyjen optimointi
Tunnistakaa N+1-kyselyt, lisätkää indeksit ja vähentäkää kyselyjen määrää.
Tietokantakyselyjen optimointi on ilmainen PHP Academy-oppitunti CoddyKitissä. Tämä on oppitunti 3/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu PHP Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. PHP Academy-kurssilla on yhteensä 4 oppituntia.
Hitaiden kyselyjen tunnistaminen
Ottakaa MySQL:n hitaiden kyselyiden loki käyttöön ja asettakaa kynnysarvo. Tarkistakaa odotettua kauemmin kestävät kyselyt.
# my.cnf:
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 0.5 # log queries over 500msEXPLAIN / EXPLAIN ANALYZE
Käyttäkää komentoa EXPLAIN ymmärtääksenne, miten MySQL suorittaa kyselyn ja käytetäänkö siinä indeksejä.
-- Run in MySQL:
EXPLAIN SELECT * FROM orders WHERE user_id = 42 AND status = "pending";
-- Look for: type=ALL (full scan), key=NULL (no index used)Indeksien lisääminen
Indeksit nopeuttavat merkittävästi suodatettujen ja lajiteltujen sarakkeiden lukemista.
-- Add composite index for the query above:
ALTER TABLE orders ADD INDEX idx_user_status (user_id, status);
// In Laravel migration:
$table->index(["user_id", "status"]);N+1-kyselyongelma
N+1-ongelma suorittaa yhden kyselyn listan hakemiseen ja lisäksi yhden kyselyn jokaista relaation alkiota kohden. Korjatkaa ongelma eager loadingilla.
<?php
// BAD: 1 + N queries
$posts = Post::all();
foreach ($posts as $post) echo $post->author->name;
// GOOD: 2 queries
$posts = Post::with("author")->get();
foreach ($posts as $post) echo $post->author->name;Vain tarvittavien sarakkeiden valinta
Välttäkää komentoa SELECT * — hakekaa vain tarvitsemanne sarakkeet muistin käytön ja verkkosiirron vähentämiseksi.
<?php
// Bad:
$users = User::all();
// Good:
$users = User::select("id", "name", "email")->get();Suurten tietojoukkojen käsittely paloissa
Käsitelkää suuret tulosjoukot paloissa, jotta muisti ei lopu.
<?php
User::chunk(500, function ($users) {
foreach ($users as $user) {
// process each user
}
});
// Or lazy loading (PHP generator):
User::lazy()->each(fn($user) => processUser($user));Kyselyiden välimuistitus
Välimuistittakaa raskaat aggregoinnit ja raportit, jotka eivät muutu usein.
<?php
$revenue = Cache::remember("monthly-revenue", 3600, function () {
return Order::whereMonth("created_at", now()->month)->sum("total");
});Välttäkää kyselyitä silmukoissa
Älkää koskaan suorittako kyselyitä foreach-silmukoissa. Kerätkää tunnisteet ensin ja hakekaa tiedot yhdellä kyselyllä.
<?php
// Collect all product IDs:
$ids = array_column($cartItems, "product_id");
// One query:
$products = Product::whereIn("id", $ids)->get()->keyBy("id");
foreach ($cartItems as $item) {
$product = $products[$item["product_id"]];
}Tietokantayhteyksien poolaus
PHP-FPM luo jokaiselle työprosessille uuden PDO-yhteyden. PgBouncer tai ProxySQL voi käyttää yhteyspoolia, jotta yhteyksien aiheuttama kuormitus ei rasita tietokantaa liikaa.
Peittävät indeksit
Peittävä indeksi sisältää kaikki kyselyn tarvitsemat sarakkeet — MySQL voi vastata kyselyyn pelkän indeksin perusteella koskematta päätaulun riveihin.
Yhteenveto
Ottakaa hitaiden kyselyiden lokit käyttöön. Etsikää puuttuvat indeksit komennolla EXPLAIN. Ladatkaa relaatiot eager loadingilla. Valitkaa vain tarvittavat sarakkeet. Käsitelkää suuret tietojoukot paloissa. Välimuistittakaa raskaat aggregoinnit. Välttäkää kyselyitä silmukoissa.
Pikatarkistus
Mikä on N+1-kyselyongelma?
Opi PHP tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 49
- Oppitunnit
- 195
Usein kysytyt kysymykset
Onko oppitunti ”Tietokantakyselyjen optimointi” ilmainen?
Kyllä – oppitunnin ”Tietokantakyselyjen optimointi” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko PHP Academy-kurssin, päivitä CoddyKit PROhon. PHP Academy-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”Tietokantakyselyjen optimointi”?
Tunnistakaa N+1-kyselyt, lisätkää indeksit ja vähentäkää kyselyjen määrää. Harjoittelet PHP Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni PHP Academy-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin PHP Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 3/4.
Kuinka kauan ”Tietokantakyselyjen optimointi”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä PHP Academy-oppitunnilla?
Kyllä. Jokainen PHP Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- PHP:n profilointi Xdebugilla
- OPcache: tavukoodin välimuisti
- Tietokantakyselyjen optimointi
- Muistinhallinta ja suorituskykyvinkit