개발자는 데이터베이스 작업에 PHP의 MySQLI 확장을 사용할 때 종종 성능 최적화 문제에 직면합니다. 특히 높은 동시성 및 고주파수 작동 시나리오에서는 올바른 기능과 호출 빈도를 선택하는 것이 중요합니다. 이 기사는 MySQLI_STMT :: ATTR_GET 기능에 중점을 두어 고주파수 작업에서 빈번한 전화에 적합한 지 여부를 탐색합니다.
mysqli_stmt :: attr_get은 mysqli 확장에서 준비된 명령문 속성을 얻기 위해 함수입니다. 프로토 타입은 다음과 같습니다.
mixed mysqli_stmt::attr_get(int $attribute)
mysqli_stmt_attr_update_max_length 와 같은 매개 변수로 속성 상수를 수용하고 속성의 현재 값을 반환합니다.
이 기능의 사용 시나리오는 주로 쿼리 문이 실행되기 전에 명령문 동작을 확인하거나 구성하는 데 사용됩니다. 예를 들어, 결과 세트에 충분한 메모리를 할당하기 위해 최대 필드 길이를 가져와야 할 때 다음을 사용할 수 있습니다.
$stmt = $mysqli->prepare("SELECT name FROM users");
$stmt->attr_get(MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH);
이 시나리오에서 attr_get은 현재 명령문 객체의 일부 내부 속성을 얻기위한 편리한 도구입니다.
mysqli_stmt :: attr_get 자체의 호출은 비용이 많이 들지 않습니다. 단순한 속성 값을 얻고 복잡한 논리 또는 데이터베이스 통신을 트리거하지 않기 때문입니다. 그러나 문제의 핵심은 다음과 같습니다. 고주파수 작업에서 이러한 기능 호출은 누적 효과가 있습니까?
PHP는 해석 된 언어이며 각 기능 호출에는 특정 컨텍스트 생성 비용이 있습니다. 고 동시성 또는 루프 내부의 Attr_get 에 대한 빈번한 호출은 성능 병목 현상을 유발하지 않지만 불필요한 기능 통화 오버 헤드도 발생합니다.
예를 들어, 다음 코드 구조는 분명히 고주파 루프에서 비효율적입니다.
for ($i = 0; $i < 100000; $i++) {
$stmt = $mysqli->prepare("SELECT name FROM users WHERE id = ?");
$stmt->attr_get(MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH);
// ...
}
이 시나리오에서 Attr_get 에 대한 호출은 특히 논리적 판단을 위해 반환되는 가치에 의존하지 않을 때 중복됩니다.
Att_get은 데이터베이스에 직접 액세스하지 못하지만 전처리 명세서의 자주 생성은 비용입니다. 대부분의 경우, 당신이 실제로 최적화 해야하는 것은 attr_get 자체가 아닌 진술 준비 ( repay () )의 반복입니다.
고주파 작업에서 동일한 속성 값을 얻기 위해 attr_get을 여러 번 호출하고 값이 변경되지 않으면 결과를 완전히 캐시 할 수 있습니다.
$max_length_attr = $stmt->attr_get(MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH);
// 후속 작업에서 직접 사용하십시오 $max_length_attr,반복적으로 부르는 대신 attr_get
이 접근법은 논리적으로 안전하고 효율적입니다.
mysqli_stmt :: attr_get 함수 자체는 가볍지 만, 고주파수 작업에서는 특히 두 가지 경우에 자주 호출하는 것이 가장 좋습니다.
속성 값은 변경되지 않습니다 . 캐시 결과를 고려해야합니다.
루프에서 호출 : 루프에서 벗어나거나 반복적 인 획득을 피하기 위해 프로그램 구조를 조정해야합니다.
PHP 데이터베이스 작동 성능을 최적화 할 때는 데이터베이스 연결 관리, 전처리 명령문 멀티플렉싱, 네트워크 대기 시간 및 I/O 병목 현상에 더 많은주의를 기울여야합니다. 기능 호출의 미세 최적화는 케이크의 착빙이지만 어둡게해서는 안됩니다.
최적화 전 :
for ($i = 0; $i < 10000; $i++) {
$stmt = $mysqli->prepare("SELECT name FROM users WHERE id = ?");
$stmt->attr_get(MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH);
}
최적화 후 :