PHP'де SQL сурамдарын колдонууну оптималдаштыруу
Берилиштер базасына SQL сурамдарын аткаруу абдан жай операция болуп саналат. Ошондуктан базага сурамдардын санын азайтууга аракет кылыш керек.
Эң кеңири таралган ката - бул циклдин ичинде бир нече SQL сурамдарын аткаруу, ал эми каалаган нерсени бир буйрук менен аткарууга мүмкүндүк берген альтернативдүү сурамдар бар.
Мисал менен карап көрөлү.
Берилиштер базасындагы жазуулардын id
массиви берилди дейли жана бизге ушул id
менен жазууларды өчүрүү керек.
Көп ойлобой, мындай "сонун" конструкцияны жаза алабыз:
<?php
$ids = [1, 2, 3, 4, 5]; // өчүрүлүүчү массив
foreach ($ids as $id) {
mysqli_query($link, "DELETE FROM users WHERE id=$id");
}
?>
Бул коддун көйгөйү - циклдин ичинде бир нече
сурам аткарылып жатат. Элестетип көрүңүз,
массивде 100 элемент болсо - базага
100 сурам аткарылат!
Сүрөттөлгөн милдеттин өзгөчө тоскоолугу - бул сайтты иштеп чыгууда берилиштер базасы кичине жана сурамдар өтө тез аткарылат. Бирок, сайт хостингте иштеп жатканда база өсөт, сурамдар барган сайын жайыраак аткарыла баштайт, жана мындайга чейин жетиши мүмкүн, мындай циклдин ичинде жүздөгөн сурамдар аткарылгандыктан сайт бир минуттан ашык жүктөлөт!
Бир аз күч салып, жалгыз гана бир сурам аткарылышына жетишсе болот, мындай:
<?php
$ids = [1, 2, 3, 4, 5];
$str = implode(',', $ids); // '1,2,3,4,5' сапын алабыз
mysqli_query($link, "DELETE FROM users WHERE id IN ($str)");
?>
Төмөндөгү кодду оптималдаштырыңыз:
<?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);
?>