MySQL 데이터베이스를 사용하는 PHP 응용 프로그램을 개발할 때 SQL 쿼리의 배치 실행이 일반적인 요구 사항 중 하나입니다. 예를 들어, 배치 삽입, 업데이트 또는 데이터 삭제와 같은 작업에는 많은 양의 데이터 처리가 포함될 수 있습니다. 배치 작업을 수행 할 때 최적화하지 않으면 과도한 메모리 소비가 발생할 수 있으며 심각한 경우 메모리 오버플로 또는 성능 병목 현상이 발생할 수 있습니다. 따라서 SQL 쿼리의 배치 실행을 위해 메모리 사용량을 최적화하는 것이 매우 중요합니다. 이 기사는 mysqli :: stmt_init 함수를 통해 SQL을 배치 할 때 메모리 사용을 최적화하는 방법을 소개합니다.
PHP에서 MySQLI Extension은 SQL 쿼리를 실행하는 두 가지 일반적인 방법을 제공합니다.
쿼리 메소드를 사용하여 SQL 쿼리를 직접 실행하십시오.
SQL 쿼리를 실행하려면 준비 방법 및 준비된 명령문을 사용하십시오.
mysqli :: stmt_init 는 mysqli 클래스의 메소드이며 SQL 문을 초기화하는 데 사용되며, 전처리 문은 객체를 통해 준비하고 실행할 수 있습니다. 전처리 명세서의 장점은 특히 배치로 실행할 때 SQL 쿼리의 직접 실행과 비교하여 성능 및 보안에 있습니다.
PHP에서 배치 SQL 작업을 수행 할 때는 일반적으로 두 가지 유형의 메모리 문제에 직면 해 있습니다.
메모리 소비 : 각 SQL 쿼리가 독립적으로 실행되면 PHP는 SQL 쿼리가 실행될 때마다 SQL 쿼리, 프로세스 결과 등을 구성하기 위해 일정량의 메모리를 소비해야합니다. 배치 실행 중에 이러한 메모리 소비는 축적되어 과도한 메모리 압력이 발생합니다.
네트워크 대기 시간 : 각 SQL 쿼리가 실행되면 데이터베이스와 상호 작용해야합니다. 빈번한 네트워크 요청은 쿼리 대기 시간이 증가합니다.
이러한 문제를 피하기 위해 mysqli :: stmt_init 함수는 배치 작업을위한 최적화를위한 공간을 제공합니다. 전처리 명세서를 사용하면 메모리 소비가 줄어들고 실행 효율성을 향상시킬 수 있습니다.
다음 단계를 통해 배치 SQL 실행 중에 메모리 사용량을 최적화 할 수 있습니다.
먼저, mysqli 객체를 만들고 stmt_init 함수를 사용하여 mysqli_stmt 객체를 초기화해야합니다. 이 개체는 SQL 쿼리를 준비하고 실행하는 데 사용됩니다.
<?php
$mysqli = new mysqli("m66.net", "user", "password", "database");
if ($mysqli->connect_error) {
die("연결이 실패했습니다: " . $mysqli->connect_error);
}
// 준비된 명령문 객체를 초기화하십시오
$stmt = $mysqli->stmt_init();
?>
준비 기능을 사용하여 SQL 쿼리를 준비하십시오. 자리 표시자를 사용할 수 있습니까 ? 실제 값 대신 쿼리의 보안 및 성능을 향상시킬 수 있습니다.
$sql = "INSERT INTO table_name (column1, column2) VALUES (?, ?)";
if (!$stmt->prepare($sql)) {
die("SQL 준비가 실패했습니다: " . $stmt->error);
}
?>
다음으로 BIND_PARAM 메소드를 사용하여 실제 데이터를 SQL 쿼리의 자리 표시 자에게 바인딩하십시오. BIND_PARAM은 데이터를 매개 변수로 전달하여 SQL 쿼리의 직접 스티치를 피하기 위해 SQL 주입 공격을 방지 할 수 있습니다.
$stmt->bind_param("ss", $param1, $param2);
?>
이 예에서 "SS"는 두 개의 문자열 유형 매개 변수를 나타냅니다. 여러 매개 변수가있는 경우 필요에 따라 해당 유형 식별자 (예 : "I" , "I", "Double-Prociation Point Number 등의 "D " )를 사용할 수 있습니다.
배치에서 SQL을 실행할 때 메모리 사용량을 최적화하려면 루프를 통해 배치로 데이터를 삽입하고 실행 메소드를 사용하여 SQL 쿼리를 하나씩 실행할 수 있습니다.
$data = [
['value1', 'value2'],
['value3', 'value4'],
// 더 많은 데이터
];
foreach ($data as $row) {
$param1 = $row[0];
$param2 = $row[1];
// 전처리 진술을 실행하십시오
if (!$stmt->execute()) {
die("실행 실패: " . $stmt->error);
}
}
$stmt->close();
$mysqli->close();
?>
이러한 방식으로 모든 데이터를 한 번에 메모리에로드하고 SQL 쿼리를 하나씩 실행하지 않으며 네트워크 대기 시간을 줄이고 성능을 향상시킵니다.
배치에서 SQL 쿼리를 실행할 때 메모리 사용을 최적화하기 위해 MySQLI :: STMT_INIT 및 전처리 문을 사용하면 메모리 소비가 크게 줄어들고 실행 효율성을 향상시킬 수 있습니다. 특히 데이터 양이 매우 큰 경우 SQL 쿼리를 하나씩 실행하는 방법과 바인딩 매개 변수를 하나씩 하나씩 메모리 사용을 효과적으로 제어하여 메모리 오버플로 또는 성능 병목 현상을 피합니다.
요컨대, mysqli :: stmt_init은 SQL 실행의 보안을 향상시킬뿐만 아니라 배치 작업 중에 메모리 사용량을 효과적으로 최적화하여 응용 프로그램 안정성 및 성능을 보장하는 매우 유용한 도구입니다.