PHP를 사용하여 데이터베이스와 상호 작용할 때 PDO (PHP 데이터 객체)는 데이터베이스에 액세스하는 매우 일반적인 방법입니다. 강력한 기능을 제공하며 그 중 하나는 pdostatement :: ColumnCount 함수입니다. 이 기능은 결과 세트에서 열 수를 얻는 데 사용되며 일반적으로 데이터를 얻을 때 일부 처리를 수행하는 데 사용합니다. 그러나 큰 결과 세트를 다룰 때 ColumnCount 에 대한 빈번한 호출은 상당한 성능 문제를 가져올 것입니다. 특히 데이터 양이 클 경우 더 많은 통화가 프로그램의 효율성을 크게 줄입니다.
이 기사에서는 pdostatement :: ColumnCount 함수에 대한 빈번한 호출로 인한 성능 병목 현상을 피하고 최적화 제안을 제공하는 방법에 대해 논의 할 것입니다.
최적화를 시작하기 전에 먼저 pdostatement :: ColumnCount 함수의 작동 방식을 이해해야합니다. 이 함수는 현재 결과 세트에서 열 수를 반환합니다. 쿼리가 실행되고 결과 세트가 검색되면 PDO는 일련의 데이터베이스 작업을 수행하여 메타 데이터를 읽고 열 정보를 얻습니다. ColumnCount를 호출하면 PDO는 검색된 열 수를 반환합니다.
큰 데이터 세트로 작업 할 때 매번 ColumnCount 호출을하는 경우 매번 특정 데이터베이스 작업을 수행해야하지만 많은 경우 매번 열 수를 얻을 필요는 없습니다. 따라서이 방법을 자주 호출하면 특히 데이터 볼륨이 크면 불필요한 오버 헤드가 발생합니다.
데이터베이스를 작동 할 때 쿼리의 열 수를 이미 알고 있고 열 수를 동적으로 변경할 필요가 없다면 쿼리 시작시 열 수를 가져 와서 변수로 저장할 수 있습니다. 이 방법으로 열 계산이 필요할 때 매번 ColumnCount 호출 없이이 변수를 직접 사용하면됩니다.
예를 들어:
<span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$pdo</span></span><span>-></span><span><span class="hljs-title function_ invoke__">query</span></span><span>(</span><span><span class="hljs-string">"SELECT id, name, age FROM users"</span></span><span>);
</span><span><span class="hljs-variable">$columnCount</span></span><span> = </span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">columnCount</span></span><span>(); </span><span><span class="hljs-comment">// 열 수를 한 번에 가져 와서 저장하십시오</span></span><span>
</span><span><span class="hljs-comment">// 앞으로 직접 사용할 수 있습니다 $columnCount,반복적 인 전화를 피하십시오 columnCount</span></span><span>
</span></span>
열 수 를 돌보는 대신 데이터를 얻으려면 fetchall 또는 fetch 메소드를 직접 사용하는 것이 좋습니다.
<span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$pdo</span></span><span>-></span><span><span class="hljs-title function_ invoke__">query</span></span><span>(</span><span><span class="hljs-string">"SELECT id, name, age FROM users"</span></span><span>);
</span><span><span class="hljs-variable">$data</span></span><span> = </span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">fetchAll</span></span><span>(PDO::</span><span><span class="hljs-variable constant_">FETCH_ASSOC</span></span><span>); </span><span><span class="hljs-comment">// 모든 데이터를 직접 가져옵니다</span></span><span>
</span><span><span class="hljs-comment">// 그렇게하면 더 이상 전화 할 필요가 없습니다 columnCount</span></span><span>
</span></span>
경우에 따라 특정 형식으로 데이터를 가져오고 싶습니다. pdostatement :: setfetchMode는 데이터 수집 모드를 한 번에 설정하는 데 도움이 될 수 있습니다. 데이터를 얻을 때마다 ColumnCount 호출을 피하십시오.
<span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$pdo</span></span><span>-></span><span><span class="hljs-title function_ invoke__">query</span></span><span>(</span><span><span class="hljs-string">"SELECT id, name, age FROM users"</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">setFetchMode</span></span><span>(PDO::</span><span><span class="hljs-variable constant_">FETCH_ASSOC</span></span><span>); </span><span><span class="hljs-comment">// 통합 리턴 형식을 설정하십시오</span></span><span>
</span><span><span class="hljs-variable">$data</span></span><span> = </span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">fetchAll</span></span><span>(); </span><span><span class="hljs-comment">// 한 번에 데이터를 얻습니다</span></span><span>
</span><span><span class="hljs-comment">// 이것은 빈번한 전화를 피합니다 columnCount</span></span><span>
</span></span>
쿼리 결과의 열 수가 자주 변경되지 않으면 캐시 캐시, 특히 동일한 쿼리가 여러 번 실행되는 시나리오에서 열 수를 변수로 고려하십시오. 이러한 방식으로 쿼리 결과의 열 수는 매번 ColumnCount 라고 불릴 필요가 없으며 캐시에서 값을 직접 검색 할 수 있습니다.
예를 들어:
<span><span><span class="hljs-variable">$columnCountCache</span></span><span> = []; </span><span><span class="hljs-comment">// 열 수를 캐시하는 데 사용됩니다</span></span><span>
</span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">getColumnCount</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$stmt</span></span></span><span>) {
</span><span><span class="hljs-keyword">global</span></span><span> </span><span><span class="hljs-variable">$columnCountCache</span></span><span>;
</span><span><span class="hljs-comment">// 쿼리 문의 해시 값을 쿼리하여 열 수가 캐시되었는지 확인하십시오.</span></span><span>
</span><span><span class="hljs-variable">$queryHash</span></span><span> = </span><span><span class="hljs-title function_ invoke__">md5</span></span><span>(</span><span><span class="hljs-variable">$stmt</span></span><span>->queryString);
</span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-keyword">isset</span></span><span>(</span><span><span class="hljs-variable">$columnCountCache</span></span><span>[</span><span><span class="hljs-variable">$queryHash</span></span><span>])) {
</span><span><span class="hljs-variable">$columnCountCache</span></span><span>[</span><span><span class="hljs-variable">$queryHash</span></span><span>] = </span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">columnCount</span></span><span>();
}
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$columnCountCache</span></span><span>[</span><span><span class="hljs-variable">$queryHash</span></span><span>];
}
</span></span>
결과 세트를 처리하는 동안 각 데이터 행에서 작동 해야하는 경우 루프에서 ColumnCount 호출을 피하십시오. ColumnCount 의 각 실행은 데이터베이스 메타 데이터를 다시 읽을 수 있으며, 특히 대규모 데이터 세트의 경우 프로그램의 성능에 영향을 줄 수 있습니다.
이를 수행하는 올바른 방법은 데이터를 처리하기 전에 열 수를 얻고 후속 사용을 위해 변수로 저장하는 것입니다.
<span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$pdo</span></span><span>-></span><span><span class="hljs-title function_ invoke__">query</span></span><span>(</span><span><span class="hljs-string">"SELECT id, name, age FROM users"</span></span><span>);
</span><span><span class="hljs-variable">$columnCount</span></span><span> = </span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">columnCount</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">$row</span></span><span> = </span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">fetch</span></span><span>(PDO::</span><span><span class="hljs-variable constant_">FETCH_ASSOC</span></span><span>)) {
</span><span><span class="hljs-comment">// 여기에서 사용할 수 있습니다 $columnCount,모든 전화 대신 columnCount</span></span><span>
}
</span></span>
쿼리 결과 세트가 매우 크면 열 수의 획득이 성능에 영향을 미치는 경우 성능에 영향을 줄 수있을뿐만 아니라 데이터 양 자체가 성능에 압력을 가할 수 있습니다. 쿼리로 반환 된 결과가 너무 커지면 한계 명령문을 사용하여 반환 된 행 수를 제한하는 것이 좋습니다.
<span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$pdo</span></span><span>-></span><span><span class="hljs-title function_ invoke__">query</span></span><span>(</span><span><span class="hljs-string">"SELECT id, name, age FROM users LIMIT 1000"</span></span><span>); </span><span><span class="hljs-comment">// 결과 세트의 크기를 제한하십시오</span></span><span>
</span></span>
ColumnCount 메소드는 PDO를 사용할 때 매우 편리하지만,이 메소드를 자주 호출하면 큰 결과 세트를 처리 할 때 성능 문제가 발생할 수 있습니다. 성능을 최적화하기 위해 다음 전략을 고려할 수 있습니다.
칼럼 수를 미리 가져 와서 저장하십시오.
fetchall 또는 fetch를 사용하여 데이터를 얻습니다.
SetFetchMode를 사용하여 데이터 수집을 최적화합니다.
반복 계산을 피하기 위해 열 수를 캐시하십시오.
이러한 최적화 측정을 통해 불필요한 성능 오버 헤드를 크게 줄이고 PHP 데이터베이스 작업의 효율성을 향상시킬 수 있습니다.