>  기사  >  백엔드 개발  >  PHP에서 MySQL로의 데이터 쿼리 프로세스 개요

PHP에서 MySQL로의 데이터 쿼리 프로세스 개요

WBOY
WBOY원래의
2016-07-30 13:30:51812검색

HP 레이어에서 MySQL 레이어로

PHP에서 sql 구성 요소 계층으로의 구성은 아래와 같습니다.

PHP에서 MySQL로의 데이터 쿼리 프로세스 개요

ext/mysqli 및 ext/mysql은 다음과 같습니다. 클라이언트 측 확장 라이브러리(라이브러리 함수), 클라이언트 측 스크립트 수준의 확장 라이브러리입니다. Mysqli 라이브러리는 mysql 라이브러리의 확장 버전입니다. 확장 버전에는 열 바인딩(Bind Column)이 추가됩니다. PDO(PHP Data Object)는 또 다른 데이터 객체 지향 확장 라이브러리입니다. 이러한 확장 라이브러리는 프로그래머를 대상으로 하며 기본 구현은 mysql 연결 엔진(예: mysqlnd 및 libmysql)입니다(http://bbs.chinaunix.net/thread-3679393-1-1.html, http: //블로그 .csdn.net/treesky/article/details/7286098).

mysqlnd와 libmysql은 PHP측(클라이언트)의 데이터베이스 연결 드라이버 엔진입니다. libmysql은 일반적인 데이터베이스 연결 엔진인 반면, mysqlnd는 PHP 전용으로 개발된 연결 엔진으로 Zend에 속합니다. PHP가 확장 라이브러리(ext/mysqli 및 ext/mysql)에서 mysql_query() 함수를 호출하여 데이터베이스 쿼리를 수행하면 Zend 엔진은 mysql(mysqlnd 및 libmysql) 쿼리 엔진을 통해 MySQL 서버에 쿼리 요청을 발행합니다.

MySQL 레이어의 데이터 쿼리

PHP에서 MySQL로의 데이터 쿼리 프로세스 개요

MySQL 서버가 클라이언트의 쿼리 요청을 받은 후 쿼리 실행 과정은 위 그림과 같습니다.
1. Query Cache에 도달하면 결과 세트가 클라이언트에 직접 반환되고, 그렇지 않으면 2단계로 이동합니다.
2. SQL 문에 대해 구문 분석, 전처리, 쿼리 최적화 및 기타 작업을 순차적으로 수행하고 최종적으로 생성합니다. 쿼리 실행 계획(select의 쿼리 실행 계획은 explain select를 통해 볼 수 있습니다)
3. MySQL 서버의 쿼리 실행 엔진은 스토리지 엔진을 호출하여 쿼리 실행 계획에 따라 데이터를 쿼리합니다. SQL 문의 마지막 연결 수준이 실행되면 쿼리 결과 세트가 생성됩니다
4. 쿼리 결과 세트는 클라이언트로 전송되며 이를 반환하는 방법에는 두 가지가 있습니다. MySQL 서버는 결과를 캐시합니다. 이를 설정하거나 캐시하지 않습니다. 이는 SQL_BUFFER_RESULT 매개변수가 설정됨에 따라 결정됩니다. 그리고 사용자가 SQL_CACHE를 설정하면 이 쿼리의 결과 집합 복사본이 쿼리 캐시에 저장됩니다(1단계 관련).

SQL_CACHE 매개변수 강화:
복잡한(다중 상관) 쿼리를 여러 단순 쿼리로 분해합니다.
1) 단순 쿼리에 대한 캐시 적중,
2) 쿼리 결과 캐시가 복잡하기 때문입니다. 실패하기 쉬움 (테이블이 너무 많이 연결됨)
3) 단순 쿼리 잠금 유지율이 낮음

MySQL 서버에서 PHP 레이어로

통신 모드 MySQL 서버와 클라이언트 통신 사용 " 반이중 통신"은 클라이언트와 서버 중 하나만 읽을 수 있고 다른 하나는 쓰기를 해야 함을 의미합니다.

장점: 프로토콜이 간단하고 클라이언트와 서버의 쓰기 권한이 상호 배타적입니다.

단점: 한쪽 끝에서는 메시지 보내기를 시작하고 다른 쪽 끝에서는 흐름 제어를 수행할 수 없습니다. 메시지에 완전히 응답해야 합니다.

계몽: 서버 쿼리 후의 결과 세트가 클라이언트로 전송되고 클라이언트(mysqlnd와 같은 클라이언트의 쿼리 엔진)는 이를 완전히 수락해야 합니다. 따라서 몇 개의 행만 필요한 경우 SQL 문에 제한을 추가하고 select *를 아껴서 사용하는 것을 잊지 마십시오.

결과 세트 반환 모드 결과 세트 반환에서 레코드의 각 행은 클라이언트-서버 통신 프로토콜을 통해 패키징된 다음 물론 TCP 계층에서 각 행이 하위 TCP 프로토콜로 전달됩니다. 먼저 캐시할 수 있습니다. 행에 기록된 프로토콜 패킷은 큰 패킷으로 구성되어 전송됩니다(응용 프로그램 계층에 투명하게).

MySQL 서버는 모든 결과 세트를 클라이언트에 보낸 후에만 결과 세트가 차지한 버퍼를 해제할 수 있습니다.

서버측 캐시 모드

PHP에서 MySQL로의 데이터 쿼리 프로세스 개요


클라이언트 명령: mysql_unbuffer_query(), 클라이언트의 SQL 드라이버 확장(mysqlnd)에 결과 세트가 설정되지 않았습니다. 캐시이므로 feth_array_xxx가 결과 집합에서 레코드를 읽을 때 서버의 버퍼에서 읽어야 합니다.

서버측 비캐시 모드

PHP에서 MySQL로의 데이터 쿼리 프로세스 개요


클라이언트 명령: mysql_query(), 버퍼는 클라이언트의 SQL 드라이버 확장(mysqlnd)에 설정됩니다. 이는 서버 측 결과 세트를 캐시하는 데 사용되므로 feth_array_xxx가 결과 세트에서 레코드를 읽을 때 해당 행은 mysqlnd 확장 버퍼에서 직접 가져옵니다.

요약

결과 집합이 매우 큰 경우: 서버측 캐시 없음 모드는 서버의 메모리 부담을 줄일 수 있지만 클라이언트의 메모리를 차지합니다. 상황에 따라 다릅니다.

PHP 레이어에서 사용자 레이어로

클라이언트 측에서는 mysql 확장 엔진(libmysql 또는 mysqlnd)이 서버 측에 연결되고, 사용자 레이어는 확장 라이브러리(ext)를 통해 연결된다. /mysql 또는 ext/ mysqli)는 mysql 엔진과 상호 작용합니다(엔진의 API를 호출하여 결과 세트를 읽는 것에서 영감을 얻었습니다).

libmysql과 mysqlnd 엔진의 메커니즘은 다릅니다. 가장 큰 차이점은 mysqlnd가 PHP로 작성되고 zend로 컴파일된다는 것입니다. 그리고 libmysql은 일반 라이브러리이므로 zend는 데이터베이스 연결을 실현하기 위해 이 라이브러리를 호출해야 합니다. 이러한 차이로 인해 mysqlnd와 zend는 접착력이 더 좋고, 데이터가 사용자 계층으로 전송될 때 데이터 복사 계층이 하나 줄어듭니다. 구체적인 아키텍처 차이점은 아래 그림에 나와 있습니다. 그림에서 다섯개 별은 캐시 버퍼를 나타냅니다.


PHP에서 MySQL로의 데이터 쿼리 프로세스 개요


ext/mysqli 및 ext/mysql은 클라이언트 확장 라이브러리(라이브러리 함수)입니다. 클라이언트 스크립트 수준에서 mysqlInd 및 libmysql은 MySQL Server 최종 드라이버입니다. . 그 중 libmysql은 일반적인 MySQL 쿼리 드라이버인 반면, mysqlnd는 PHP용으로 특별히 설정된 Zend 엔진 기반 SQL 드라이버입니다. 즉, mysqlnd의 데이터 기반 작업에는 Zend와 mysqlserver 간의 상호 작용이 필요한 반면, libmysql은 mysqlserver와 직접 상호 작용합니다.

비교:
ext/mysqli(또는 ext/mysql)와 libmysql 간의 데이터베이스 쿼리 프로세스는 다음과 같습니다.
1) mysqi가 libmysql 드라이버에 쿼리 요청을 보냅니다.
2) Libmysql 실행 요청 그리고 스토리지 도메인 libmysql의 버퍼에 있는 결과 세트를 가져옵니다
3) Mysqli는 메모리에 적용됩니다: zval에 의해 지정된 버퍼
4) Mysqii는 libmysql의 결과 세트를 zval에 의해 지정된 버퍼에 복사합니다
ext/mysqli(또는 ext /mysql) 및 mysqlnd 데이터베이스 쿼리 프로세스는 다음과 같습니다.
1) mysqi는 mysqlnd 드라이버에 쿼리 요청을 보냅니다.
2) mysqlnd 드라이버는 zend 엔진을 통해 sql 쿼리를 실행하고, 각 결과 세트의 행은 버퍼에 의해 저장됩니다(각 버퍼는 분산됨)
3) Mysqlnd는 여러 zval을 생성하고 이러한 버퍼를 가리킵니다

예:
ext/mysql & libmysql에서, libmysql 드라이버는 SQL 문을 실행하여 결과 집합 Row1~Row3을 얻은 다음 ext/mysql은 결과 집합을 zend 버퍼에 복사하고 mysqli_fetch_xxx 함수는 이 영역의 메모리에서 결과 집합의 내용을 읽습니다.
ext/mysqli & mysqlInd에서 mysqlnd 드라이버는 SQL 문을 실행하여 결과 집합 Row1~Row3을 얻습니다. 여기서 각 행은 zend 버퍼에 직접 저장되고 zval이 가리킵니다. 클라이언트는 mysqli_fetch_xxx를 구현하기 위한 매핑을 통해 이 메모리 영역에서 직접 결과를 읽습니다.

요약

mysqlnd와 zend는 더 응집력이 있습니다. sql 쿼리 드라이버에서 mysqlnd는 zend 엔진을 통해 데이터베이스에 액세스하고 결과를 libmysql 드라이버(독립)에 직접 저장합니다. zend), 결과 세트 캐시의 복사본이 하나 줄어듭니다.

참조

"고성능 MySQL"

http://www.cnxct.com/libmysql-mysqlnd-which-is-best-and-what-about- mysqli-pdomysql-mysql/

http://www.cnxct.com/wp-content/uploads/2012/12/andrey-mysqlnd.pdf

저작권 설명: 이 문서는 작성되었습니다. by the blogger (http://blog.csdn.net/ordereder) 원본 기사는 블로거의 허가 없이 복제할 수 없습니다.

위에서는 프로세스 측면을 포함하여 PHP에서 MySQL까지의 데이터 쿼리 프로세스에 대한 개요를 소개합니다. MySql에 관심이 있는 친구들에게 도움이 되기를 바랍니다.

컴퓨터/휴대전화 팁: 공유 문서 취소
기본적으로 Windows XP에서 내 컴퓨터를 열면 하드 디스크 아이콘 위에 일부 폴더가 표시됩니다. 이는 "공유 폴더"이며 여기에는 사용자가 파일을 공유하는 데 사용하는 각 폴더가 있습니다. 원칙은 매우 간단합니다. 레지스트리를 열고 다음 위치를 찾으세요. HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows CurrentVersion ExplorerMyComputerNameSpaceDelegateFolders. 다음 번에 나를 열어주세요. .컴퓨터에는 이러한 성가신 폴더가 더 이상 존재하지 않습니다.

위에서는 다양한 측면을 포함하여 PHP에서 MySQL로의 데이터 쿼리 프로세스에 대한 개요를 소개했습니다. PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.