Uboreshaji wa Matumizi ya Maswali ya SQL katika PHP
Utekelezaji wa maswali ya SQL kwa hifadhidata ni operesheni yenye kuwaka polepole sana. Kwa hivyo ni muhimu kujaribu kupunguza idadi ya maswali kwenye hifadhidata.
Kosa la kawaida kabisa ni utekelezaji wa wingi wa maswali ya SQL katika kitanzi, hali kadhalika, kuna maswali mbadala yanayoruhusu kufanikisha kile unachotaka kwa amri moja.
Tuangalie kwa mfano.
Wacha tuwe na safu yenye id ya kumbukumbu
katika hifadhidata data na tunahitaji kufuta kumbukumbu
zenye id hizo.
Bila kufikiria sana, mtu anaweza kuandika muundo "mzuri" kama huu:
<?php
$ids = [1, 2, 3, 4, 5]; // safu ya kufutia
foreach ($ids as $id) {
mysqli_query($link, "DELETE FROM users WHERE id=$id");
}
?>
Shida ya msimbo huu ni kwamba, katika kitanzi, hutekeleza
wingi wa maswali. Fikiria kuwa
kwenye safu kutakuwa na vitu 100 - hutekeleza
maswali 100 kwenye hifadhidata!
Mtego maalum wa kazi iliyoelezwa ni kwamba wakati wa kuunda tovuti, hifadhidata data ni ndogo na maswali hutekelezwa haraka sana. Hata hivyo, kadiri tovuti inavyofanya kazi kwenye hesti, hifadhidata itakuwa inakua, maswali yataanza kuteleza polepole zaidi, na inaweza kufikia hali ambapo, kutokana na utekelezaji wa mamia ya maswali katika kitanzi, tovuti itapakia kwa zaidi ya dakika moja!
Kwa kutumia juhudi kidogo tu, inawezekana kufanya hivi kwamba, utekelezaji wa swali moja tu ndio utafanyika, kama hivi:
<?php
$ids = [1, 2, 3, 4, 5];
$str = implode(',', $ids); // tutapata mfuatano '1,2,3,4,5'
mysqli_query($link, "DELETE FROM users WHERE id IN ($str)");
?>
Boresha msimbo ulio hapa chini:
<?php
$arr = [1, 2, 2, 4, 5];
$res = [];
for ($i = 1; $i < count($arr); $i++) {
$note = mysqli_query($link, "SELECT * FROM users WHERE id=$id");
for ($data = []; $row = mysqli_fetch_assoc($note); $data[] = $row);
$res[] = $data;
}
var_dump($res);
?>