Βελτιστοποίηση της χρήσης SQL ερωτημάτων σε PHP
Η εκτέλεση 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 ερωτήματα στη βάση!
Η ιδιαίτερη παγίδα της περιγραφόμενης εργασίας είναι ότι κατά την ανάπτυξη του site η βάση δεδομένων είναι μικρή και τα ερωτήματα εκτελούνται πολύ γρήγορα. Ωστόσο, καθώς το site λειτουργεί στο hosting, η βάση θα μεγαλώνει, τα ερωτήματα θα εκτελούνται όλο και πιο αργά, και μπορεί να φτάσει σε σημείο που, λόγω της εκτέλεσης εκατό ερωτημάτων σε βρόχο, το site να φορτώνει πάνω από ένα λεπτό!
Με πολύ λίγη προσπάθεια, μπορούμε να κάνουμε να εκτελείται μόνο ένα ερώτημα, έτσι:
<?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);
?>