이 기사에서는 mysql에 대한 관련 지식을 제공합니다. 주로 쿼리문의 실행 프로세스를 소개합니다. MYSQL을 예로 들어 MySQL 데이터베이스의 쿼리 프로세스를 공개하고 데이터베이스의 일부 부분을 누구나 이해할 수 있도록 합니다. 이해합니다. 모두에게 도움이 되기를 바랍니다.
추천 학습: mysql 비디오 튜토리얼
데이터베이스에서 요구 사항을 충족하는 특정 데이터를 검색해야 합니다. Select A B C FROM T WHERE ID = XX와 같이 SQL을 쉽게 작성할 수 있습니다. 데이터베이스 요청 시 데이터베이스는 정확히 어떤 일을 합니까?
오늘은 MySQL 데이터베이스의 쿼리 프로세스를 공개하고 데이터베이스의 일부 부분을 모두가 이해할 수 있도록 MYSQL을 예로 들어보겠습니다.
MySQL은 크게 서버 레이어와 스토리지 엔진 레이어로 나눌 수 있습니다.
서버 레이어에는 커넥터, 쿼리 캐시, 분석기, 최적화 프로그램, 실행기 등이 포함됩니다. 저장 프로시저, 트리거, 뷰, 함수 등과 같은 모든 교차 스토리지 엔진 기능이 이 레이어에서 구현되며 일반 로그 모듈 binlog 로그 모듈
스토리지 엔진 레이어는 데이터 저장 및 검색을 담당합니다. 아키텍처 모델은 플러그인이며 InnoDB, MyISAM 및 Memory와 같은 여러 스토리지 엔진을 지원합니다. 현재 가장 일반적으로 사용되는 스토리지 엔진은 InnoDB(트랜잭션 지원)이며 MySQL 버전 5.5.5부터 기본 스토리지 엔진이 되었습니다.
커넥터는 주로 계정 비밀번호, 권한 및 기타 작업 확인을 포함하여 데이터베이스에 대한 사용자 로그인 및 사용자 신원 인증을 담당합니다.
사용자 비밀번호가 올바르지 않으면 "사용자에 대한 접근이 거부되었습니다." 오류가 발생하고 클라이언트 프로그램이 실행을 종료합니다.
사용자 계정 비밀번호가 전달된 경우 커넥터는 권한 테이블에서 사용자의 모든 권한을 쿼리합니다. 이와 관련된 후속 권한 논리 판단은 이때 읽은 권한 데이터, 즉 후속 권한에 의존합니다. 연결이 끊어지지 않는 한 관리자가 사용자의 권한을 수정하더라도 사용자는 영향을 받지 않습니다.
클라이언트가 서버와 연결을 설정한 후 MySQL은 쿼리 문을 실행할 때 먼저 캐시를 쿼리하여 이전에 이 SQL이 실행되었는지 확인합니다. 이전에 실행된 명령문과 그 결과는 키-값 쌍의 형태로 메모리에 직접 캐시됩니다. 키는 쿼리문이고, 값은 쿼리 결과입니다. 쿼리가 이 캐시에서 직접 키를 찾을 수 있으면 값이 클라이언트에 직접 반환됩니다. 적중이 없으면 후속 작업을 수행해야 하며 다음 호출을 용이하게 하기 위해 완료 후 결과가 캐시됩니다.
이것을 보면 눈이 번쩍 뜨이고 이 기능을 잘 활용하고 싶은 충동이 생길 것입니다.
실제로 여기서는 쿼리 캐시를 사용하지 않는 것이 좋습니다. 테이블이 업데이트되는 한 이 테이블의 모든 쿼리 캐시가 지워지는 경우가 많습니다. 따라서 결과를 저장하는 데 어려움을 겪었지만 사용하기도 전에 업데이트로 인해 결과가 지워질 수도 있습니다. 업데이트 압력이 심한 데이터베이스의 경우 쿼리 캐시 적중률이 매우 낮습니다. 시스템 구성 테이블처럼 오랫동안 업데이트되지 않는 종류의 테이블이 아니라면, 이런 시스템 구성을 구성 플랫폼에 넣어야 하지 않을까요?
MYSQL8.0에서는 쿼리 캐시 기능이 삭제되었습니다. 관계자들도 이 기능이 실제 적용 시나리오가 거의 없다고 생각하여 간단히 삭제했습니다.
Mysql이 쿼리 캐시에 도달하지 않으면 분석기에 들어가게 됩니다. 분석기는 주로 SQL 문이 무엇인지 분석하는 데 사용됩니다. 분석기는 크게 다음 두 단계로 나누어집니다.
어휘 분석: SQL 문은 여러 문자열로 구성됩니다. 먼저 선택, 쿼리 테이블, 필드 이름, 쿼리 조건 등과 같은 키워드를 추출해야 합니다. .을(를) 추출해야 합니다.
문법 분석: 문법 분석은 주로 어휘 분석 결과를 바탕으로 입력한 SQL 문이 올바른지, MYSQL 구문을 준수하는지 확인합니다. SQL 구문" 오류 메시지가 나타납니다.
어휘 분석 프로그램은 전체 쿼리 문을 다양한 유형의 플래그로 분해하고 구문 분석은 정의된 시스템 언어를 기반으로 "다양한 유형의 플래그"를 MySQL에 대한 의미 있는 조합으로 변환합니다. 마지막으로 시스템은 최적화 프로그램이 의존하는 데이터 구조인 구문 트리(AST)를 생성합니다.
분석기를 통과하면 MySQL은 사용자가 원하는 작업을 알게 됩니다. 실행이 시작되기 전에 최적화 프로그램에서 처리해야 합니다.
옵티마이저가 왜 필요한가요?
최적화 프로그램에는 최고의 프로그래머보다 더 복잡한 복잡한 최적화 기술이 많이 포함되어 있습니다. 시스템의 자동 최적화는 이러한 최적화 기술을 모든 사람이 사용할 수 있도록 하는 것과 같습니다.
옵티마이저는 데이터 사전에서 테이블의 행 수, 테이블의 각 열 분포 등 많은 통계 정보를 얻을 수 있습니다. 옵티마이저 옵티마이저는 수백 가지의 다양한 실행 계획을 고려할 수 있지만 프로그래머는 일반적으로 제한된 수의 가능성만 고려할 수 있습니다.
이 정보를 기반으로 효과적인 실행 계획을 선택할 수 있지만 사용자 프로그램은 이를 얻기가 어렵습니다. ;
간단히 말하면 옵티마이저는 구문 분석 트리의 모양을 수정하고, 구문 분석 트리를 쿼리 트리로 변경하고, 실행 계획을 결정합니다.
MySQL은 분석기를 통해 무엇을 하고 싶은지, 옵티마이저를 통해 어떻게 하는지 알고 있으므로 실행기 단계에 들어가서 명령문을 실행하기 시작합니다.
실행을 시작할 때 먼저 사용자에게 쿼리를 실행할 권한이 있는지 확인해야 합니다. 그렇지 않으면 권한이 없다는 오류가 반환됩니다. 권한이 있으면 엔진의 인터페이스를 호출하고 인터페이스 실행 결과를 반환합니다.
MYSQL 쿼리의 실행 과정을 분석하기 위해 다음과 같은 실제 SQL 쿼리 문을 사용합니다. 오류 메시지가 바로 반환됩니다. 올바른 경우 다음 단계로 이동하세요.
MYSQL8.0 이전에는 먼저 쿼리 캐시로 이동하여 이 SQL 문을 키로 사용하여 메모리에 결과가 있는지 쿼리합니다. 결과가 있으면 먼저 권한이 있는지 확인합니다. .권한이 있으면 클라이언트로 반환되고, 그렇지 않으면 오류가 보고됩니다. 쿼리 캐시에서 적중이 없으면 다음 단계로 이동합니다.
분석기를 통해 어휘 분석을 수행하고 핵심 요소를 추출합니다. 예를 들어 위 문장은 query select이고, 조회해야 할 테이블 이름은 user code>이고, 조회할 컬럼은 <code>id,name,sex, 전화
이고 쿼리 조건은 age=26
및 account=javadailly
입니다. 그런 다음 SQL 문에 키워드가 올바른지 등 문법 오류가 있는지 확인합니다. 문제가 없으면 다음 단계로 진행합니다.
위 SQL에는 두 가지 실행 계획이 있습니다. 최적화 프로그램은 자체 최적화 알고리즘을 기반으로 실행 효율성이 가장 높은 계획 A를 선택합니다. (부정확한 통계 정보로 인해 최적화 계획이 결정되면 최적화 프로그램이 잘못된 실행 계획을 선택할 수 있습니다.) , 구현을 시작하세요.
a. 먼저 account=javadaily
사용자를 쿼리한 다음 age
가 26인지 확인합니다. b. 먼저 age 사용자를 찾습니다. =26
사용자인 경우 account=javadaily
의 사용자 user
,需要查询的列为id,name,sex,phoone
,查询条件是age=26
和account=javadailly
。然后判断这个sql语句是否有语法错误,比如关键词是否正确等等,如果检查没问题就执行下一步。
上面的SQL有两种执行方案,优化器根据自己的优化算法选择执行效率最高的a方案(统计信息不准可能导致优化器选择错误的执行方案),确定了优化方案后就开始执行。
a. 先查询 account=javadaily
的用户,然后判断 age
是否等于26 b. 先找出 age=26
的用户,再查询 account=javadaily
위 내용은 MySQL 쿼리문의 실행 과정에 대한 심층 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!