현재 위치: > 최신 기사 목록> 다중 자율 세트 쿼리에서 mysqli_stmt :: store_result를 효율적으로 사용하는 방법은 무엇입니까?

다중 자율 세트 쿼리에서 mysqli_stmt :: store_result를 효율적으로 사용하는 방법은 무엇입니까?

gitbox 2025-09-15

다중 수용 세트 쿼리 란 무엇입니까?

멀티 레지컬트 세트 쿼리는 단일 SQL 쿼리가 여러 결과 세트를 반환하는 상황을 나타냅니다. 일반적 으로이 쿼리는 여러 SQL 문을 분리하는 ( 세미콜론)에 의해 수행됩니다. 예를 들어:

 <span><span><span class="hljs-keyword">SELECT</span></span><span> </span><span><span class="hljs-operator">*</span></span><span> </span><span><span class="hljs-keyword">FROM</span></span><span> table1;
</span><span><span class="hljs-keyword">SELECT</span></span><span> </span><span><span class="hljs-operator">*</span></span><span> </span><span><span class="hljs-keyword">FROM</span></span><span> table2;
</span></span>

위의 쿼리는 두 가지 결과 세트를 반환합니다. MySQL의 경우 MySQLI_MULTI_QUERY () 함수를 통해 다중 자율 세트 쿼리를 수행하고 MySQLI_NEXT_RESULT () 를 통해 다음 세트로 전환 할 수 있습니다.

mysqli_stmt :: store_result () 의 역할

MySQLI 확장에서 MySQLI_STMT :: Store_Result ()는 서버의 쿼리 결과를 클라이언트에 저장하는 데 사용되는 기능입니다. 이는 쿼리 결과 세트의 데이터가 데이터베이스 서버에서 클라이언트의 메모리로 완전히로드됨을 의미합니다. 데이터에 여러 번 액세스하는 시나리오의 경우 Store_Result ()는 데이터를 읽을 때마다 데이터베이스 서버와 상호 작용하지 않기 때문에 성능을 향상시킬 수 있습니다.

다중 자극 세트 쿼리의 과제

다중 자극 세트 쿼리를 수행 할 때 각 결과 세트는 데이터를 독립적으로 반환합니다. store_result ()를 잘못 사용하면 다음 문제가 발생할 수 있습니다.

  1. 높은 메모리 풋 프린트 : 쿼리 결과 세트가 매우 크면 Store_Result () 호출은 전체 결과를 메모리에로드하여 메모리 풋 프린트가 과도하게 발생할 수 있습니다.

  2. 결과 세트는 완전히 읽히지 않습니다 . 다중 자극 세트 쿼리에서 mysqli_next_result ()store_result () 가 올바르게 호출되지 않으면 일부 결과 세트를 완전히 읽지 않아 후속 쿼리의 오류가 발생할 수 있습니다.

  3. 실행 효율성 문제 : 각 쿼리에는 데이터베이스에서 완전한 데이터 세트를로드해야하므로 Store_Result () 를 과도하게 사용하면 성능 부담이됩니다.

mysqli_stmt :: store_result () 메소드를 효율적으로 사용하십시오

1. MySQLI_MULTI_QUERY ()를 사용하여 다중 자율 세트 쿼리를 수행하십시오

먼저 MySQLI_MULTI_QUERY () 함수를 사용하여 다중 자율 세트 쿼리를 수행해야합니다. 이 기능을 사용하면 여러 SQL 문을 실행하고 여러 결과 세트를 반환 할 수 있습니다. 이를 사용하면 하나의 핵심 포인트를 기록해야합니다. mysqli_multi_query ()는 모든 쿼리 결과를 반환하지만 결과 세트를 자동으로 처리하지는 않습니다. mysqli_next_result () 를 통해 각 결과 세트를 수동으로 반복해야합니다.

 <span><span><span class="hljs-variable">$conn</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">mysqli</span></span><span>(</span><span><span class="hljs-variable">$host</span></span><span>, </span><span><span class="hljs-variable">$user</span></span><span>, </span><span><span class="hljs-variable">$password</span></span><span>, </span><span><span class="hljs-variable">$dbname</span></span><span>);

</span><span><span class="hljs-variable">$sql</span></span><span> = </span><span><span class="hljs-string">"SELECT * FROM table1; SELECT * FROM table2;"</span></span><span>;

</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$conn</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">multi_query</span></span><span>(</span><span><span class="hljs-variable">$sql</span></span><span>)) {
    </span><span><span class="hljs-keyword">do</span></span><span> {
        </span><span><span class="hljs-comment">// 현재 결과 세트를 가져옵니다</span></span><span>
        </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-variable">$conn</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">store_result</span></span><span>()) {
            </span><span><span class="hljs-keyword">while</span></span><span> (</span><span><span class="hljs-variable">$row</span></span><span> = </span><span><span class="hljs-variable">$result</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">fetch_assoc</span></span><span>()) {
                </span><span><span class="hljs-comment">// 각 데이터 행을 처리합니다</span></span><span>
                </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Data: "</span></span><span> . </span><span><span class="hljs-variable">$row</span></span><span>[</span><span><span class="hljs-string">'column_name'</span></span><span>] . </span><span><span class="hljs-string">"\n"</span></span><span>;
            }
            </span><span><span class="hljs-variable">$result</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">free</span></span><span>();  </span><span><span class="hljs-comment">// 현재 결과 세트를 해제하십시오</span></span><span>
        }
    } </span><span><span class="hljs-keyword">while</span></span><span> (</span><span><span class="hljs-variable">$conn</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">next_result</span></span><span>());  </span><span><span class="hljs-comment">// 다음 결과 세트를 얻으십시오</span></span><span>
}

</span><span><span class="hljs-variable">$conn</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">close</span></span><span>();
</span></span>

2. Store_Result ()를 사용할 때 메모리 관리에주의를 기울이십시오.

store_result () 는 전체 쿼리 결과를 메모리에로드하므로 많은 양의 데이터를 처리 할 때 메모리가 충분하지 않을 수 있습니다. 메모리를 효율적으로 관리하려면 각 결과 세트가 처리 된 후 $ result-> free ()를 사용하여 메모리 공간을 확보하는 것이 좋습니다.

3. 필요한 경우에만 store_result ()를 사용하십시오

모든 쿼리에 Store_result () 를 사용해야하는 것은 아닙니다. 특히 쿼리 결과 만 한 번에 읽어야하는 경우. 간단한 선택 쿼리의 경우 데이터의 일부만 가져와야하고 쿼리 결과가 작 으면 bind_result () 또는 fetch ()를 사용하여 store_result () 를 사용하는 대신 데이터를 얻는 것을 고려할 수 있습니다. 이것은 메모리 소비를 줄입니다.

 <span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$conn</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-string">"SELECT * FROM table1"</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">execute</span></span><span>();
</span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">bind_result</span></span><span>(</span><span><span class="hljs-variable">$column1</span></span><span>, </span><span><span class="hljs-variable">$column2</span></span><span>);
</span><span><span class="hljs-keyword">while</span></span><span> (</span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">fetch</span></span><span>()) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Data: "</span></span><span> . </span><span><span class="hljs-variable">$column1</span></span><span> . </span><span><span class="hljs-string">", "</span></span><span> . </span><span><span class="hljs-variable">$column2</span></span><span> . </span><span><span class="hljs-string">"\n"</span></span><span>;
}
</span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">close</span></span><span>();
</span></span>

4. Paglination 쿼리를 사용하여 결과 세트 크기를 줄입니다.

결과 세트가 매우 크면 쿼리를 여러 페이징 쿼리로 분할하십시오. 쿼리 당 반환 된 레코드 수를 제한함으로써 한 번에로드 된 데이터의 양이 줄어들어 효율성이 높아지고 메모리 사용량이 줄어 듭니다.

 <span><span><span class="hljs-variable">$page</span></span><span> = </span><span><span class="hljs-number">1</span></span><span>;
</span><span><span class="hljs-variable">$perPage</span></span><span> = </span><span><span class="hljs-number">10</span></span><span>;
</span><span><span class="hljs-variable">$offset</span></span><span> = (</span><span><span class="hljs-variable">$page</span></span><span> - </span><span><span class="hljs-number">1</span></span><span>) * </span><span><span class="hljs-variable">$perPage</span></span><span>;

</span><span><span class="hljs-variable">$sql</span></span><span> = </span><span><span class="hljs-string">"SELECT * FROM table1 LIMIT <span class="hljs-subst">$offset</span></span></span><span>, </span><span><span class="hljs-subst">$perPage</span></span><span>";
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-variable">$conn</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">query</span></span><span>(</span><span><span class="hljs-variable">$sql</span></span><span>);

</span><span><span class="hljs-keyword">while</span></span><span> (</span><span><span class="hljs-variable">$row</span></span><span> = </span><span><span class="hljs-variable">$result</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">fetch_assoc</span></span><span>()) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Data: "</span></span><span> . </span><span><span class="hljs-variable">$row</span></span><span>[</span><span><span class="hljs-string">'column_name'</span></span><span>] . </span><span><span class="hljs-string">"\n"</span></span><span>;
}
</span></span>

5. 쿼리 실행 시간을 모니터링합니다

다중 자율 세트 쿼리에서 store_result () 를 효율적으로 사용하기 위해 실행 시간 모니터링을 코드에 추가하여 쿼리로 인해 성능 병목 현상이 발생했는지 여부를 결정할 수 있습니다. 쿼리가 너무 느리면 SQL 문을 최적화하거나 단계별로 수행하는 것을 고려할 수 있습니다.

 <span><span><span class="hljs-variable">$start_time</span></span><span> = </span><span><span class="hljs-title function_ invoke__">microtime</span></span><span>(</span><span><span class="hljs-literal">true</span></span><span>);

</span><span><span class="hljs-comment">// 쿼리를 실행하십시오</span></span><span>

</span><span><span class="hljs-variable">$end_time</span></span><span> = </span><span><span class="hljs-title function_ invoke__">microtime</span></span><span>(</span><span><span class="hljs-literal">true</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Query Time: "</span></span><span> . (</span><span><span class="hljs-variable">$end_time</span></span><span> - </span><span><span class="hljs-variable">$start_time</span></span><span>) . </span><span><span class="hljs-string">" seconds"</span></span><span>;
</span></span>