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개의 쿼리가 실행됩니다!
설명한 작업의 특별한 함정은 사이트 개발 시 데이터베이스가 작고 쿼리가 매우 빠르게 실행된다는 점입니다. 그러나 호스팅에서 사이트가 작동함에 따라 데이터베이스는 성장하고, 쿼리는 점점 더 느려지며, 루프에서 수백 개의 쿼리를 실행하여 사이트가 1분 이상 로드되는 상황에 이를 수 있습니다!
아주 적은 노력으로 단 하나의 쿼리만 실행되도록 만들 수 있습니다. 다음과 같이요:
<?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);
?>