Tối ưu hóa việc sử dụng truy vấn SQL trong PHP
Thực thi truy vấn SQL đến cơ sở dữ liệu là một thao tác rất chậm. Vì vậy cần phải cố gắng giảm thiểu số lượng truy vấn đến cơ sở dữ liệu.
Lỗi phổ biến nhất là thực thi nhiều truy vấn SQL trong vòng lặp, trong khi lại tồn tại các truy vấn thay thế cho phép thực hiện điều mong muốn chỉ bằng một lệnh.
Hãy xem xét qua ví dụ.
Giả sử chúng ta có một mảng chứa id của các bản ghi
trong cơ sở dữ liệu và chúng ta cần xóa các bản ghi
với các id đó.
Không cần suy nghĩ lâu, có thể viết ra một cấu trúc "tuyệt vời" như thế này:
<?php
$ids = [1, 2, 3, 4, 5]; // mảng cần xóa
foreach ($ids as $id) {
mysqli_query($link, "DELETE FROM users WHERE id=$id");
}
?>
Vấn đề của đoạn mã này là trong vòng lặp thực hiện
rất nhiều truy vấn. Hãy tưởng tượng,
trong mảng sẽ có 100 phần tử - sẽ thực thi
100 truy vấn đến cơ sở dữ liệu!
Cái bẫy đặc biệt của nhiệm vụ được mô tả ở chỗ khi phát triển website, cơ sở dữ liệu nhỏ và các truy vấn thực thi rất nhanh. Tuy nhiên, theo thời gian website hoạt động trên hosting, cơ sở dữ liệu sẽ phát triển, các truy vấn sẽ thực thi ngày càng chậm hơn, và có thể dẫn đến việc do thực thi hàng trăm truy vấn trong vòng lặp, website sẽ tải hơn một phút!
Chỉ với một chút nỗ lực, có thể làm sao chỉ thực thi một truy vấn duy nhất, như thế này:
<?php
$ids = [1, 2, 3, 4, 5];
$str = implode(',', $ids); // nhận được chuỗi '1,2,3,4,5'
mysqli_query($link, "DELETE FROM users WHERE id IN ($str)");
?>
Hãy tối ưu hóa đoạn mã dưới đây:
<?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);
?>