이 기사는 mysql에 대한 관련 지식을 제공합니다. 데이터베이스 아키텍처, 인덱싱 및 SQL 최적화 등 인터뷰에서 자주 묻는 몇 가지 질문을 주로 정리했습니다. 모든 사람에게 도움이 되기를 바랍니다.
추천 학습: mysql 튜토리얼
면접관에게 화이트보드가 있으면 그림을 그릴 수 있습니다. 다음 사진은 인터넷에서 가져온 것입니다.
Mysql 논리 아키텍처 다이어그램은 크게 세 가지 레이어로 나뉩니다.
(1) 첫 번째 레이어는 연결 처리, 인증 인증, 보안 등을 담당합니다.
(2) 두 번째 레이어는 컴파일 및 SQL 최적화
(3) 세 번째 계층은 스토리지 엔진입니다.
먼저 권한
이 있는지 확인하세요. 권한이 없으면 바로 오류 메시지가 반환됩니다. (MySQL8.0 버전 이전에는) 캐시를 먼저 쿼리합니다. ). 是否有权限
,如果没有权限,直接返回错误信息,如果有权限会先查询缓存(MySQL8.0 版本以前)。
如果没有缓存,分析器进行词法分析
,提取 sql 语句中 select 等关键元素,然后判断 sql 语句是否有语法错误,比如关键词是否正确等等。
最后优化器确定执行方案进行权限校验,如果没有权限就直接返回错误信息,如果有权限就会调用数据库引擎接口
어휘분석
을 수행하여 sql 문에서 select 등의 핵심 요소를 추출한 후 sql 문에 키워드가 있는지 등 문법 오류가 있는지 확인합니다. 등등이 맞습니다.
마지막으로 옵티마이저는 실행 계획을 결정하고 권한 확인을 수행합니다. 권한이 없으면 바로 오류 메시지를 반환합니다. 데이터베이스 엔진 인터페이스를 호출
합니다. 그리고 실행 결과를 반환합니다.
테이블 구조 최적화
(1) 숫자 필드를 사용해 보세요숫자 정보만 포함하는 필드인 경우 문자 유형으로 디자인하지 마세요. 이는 쿼리 및 조인 성능을 감소시키고 스토리지 오버헤드를 증가시킵니다. 엔진은 쿼리 및 연결 처리 시 문자열의 각 문자를 하나씩 비교하는데, 숫자 유형의 경우 한 번의 비교만으로 충분하기 때문입니다. (2) char 대신 varchar를 최대한 사용하세요쿼리 최적화
(3) 테이블 열: explain 행이 액세스하는 테이블을 나타냅니다.
(4) 유형 컬럼: 가장 중요한 컬럼 중 하나입니다. MySQL이 테이블에서 행을 찾는 방법을 결정하는 연결 유형 또는 액세스 유형을 나타냅니다. 최고부터 최악까지: system > const > eq_ref > index_merge > index_subquery > index > 쿼리를 사용하여 찾을 수 있습니다.
(6) 키 열: 이 열은 mysql이 테이블에 대한 액세스를 최적화하기 위해 실제로 사용하는 인덱스를 보여줍니다. (7) key_len 열: mysql이 인덱스에서 사용하는 바이트 수를 표시합니다. 이 값은 인덱스에서 어떤 열이 사용되는지 계산하는 데 사용할 수 있습니다. (8) 참조 열: 이 열은 테이블에서 키 열 레코드의 인덱스에서 값을 조회하는 데 사용하는 열이나 상수를 표시합니다. 일반적인 열에는 const(상수), func, NULL 및 필드 이름이 포함됩니다. . (9) 행 열: 이 열은 mysql이 읽고 감지할 것으로 추정하는 행 수입니다. 이는 결과 집합의 행 수가 아닙니다. (10) 추가 열: 추가 정보를 표시합니다. 예를 들어 인덱스 사용, 위치 사용, 임시 사용 등이 있습니다.우리가 보통 SQL을 작성할 때, 분석 설명을 사용하는 습관을 길러야 합니다. 느린 쿼리, 운영 및 유지 관리에 대한 통계는 정기적으로 통계를 제공합니다
느린 쿼리 아이디어 최적화:
문 분석, 불필요한 필드/데이터 로드 여부
SQL 실행 문장이 인덱스에 도달하는지 분석 , etc.
SQL이 매우 복잡하다면 SQL 구조를 최적화하세요
테이블 데이터의 양이 너무 많으면 하위 테이블을 고려하세요
(1) 테이블은 클러스터형 인덱스를 하나만 가질 수 있지만 테이블은 여러 개의 비클러스터형 인덱스를 가질 수 있습니다.
(2) 클러스터형 인덱스, 인덱스에 있는 키 값의 논리적 순서는 테이블에서 해당 행의 물리적 순서를 결정합니다. 비클러스터형 인덱스는 인덱스의 논리적 순서와 다릅니다. 디스크에 있는 행의 물리적 저장 순서입니다.
(3) 인덱스는 이진 트리의 데이터 구조를 통해 설명됩니다. 클러스터형 인덱스는 다음과 같이 이해할 수 있습니다. 인덱스의 리프 노드는 데이터 노드입니다. 비클러스터형 인덱스의 리프 노드는 여전히 인덱스 노드이지만 해당 데이터 블록을 가리키는 포인터가 있습니다.
(4) 클러스터형 인덱스: 물리적 저장소는 인덱스에 따라 정렬됩니다. 비클러스터형 인덱스: 물리적 저장소는 인덱스에 따라 정렬되지 않습니다.
3.2. B+ 트리를 사용하는 이유는 무엇입니까?
3.2.1. 왜 일반 이진 트리가 아닌가?
3.2.2. 왜 균형 잡힌 이진 트리가 아닌가?
3.2.3. 왜 B 트리가 아니고 B+ 트리인가요?
B+ 트리 인덱스의 모든 데이터는 리프 노드에 저장되며, 데이터는 순서대로 정렬되어 연결리스트로 연결됩니다. 그러면 B+ 트리는 범위 검색, 정렬 검색, 그룹 검색 및 중복 제거 검색을 매우 간단하게 만듭니다.
3.3. 해시 인덱스와 B+ 트리 인덱스의 차이점은 무엇인가요? 인덱스 디자인을 어떻게 선택하셨나요?
(a1, a2, a3)과 같은 결합 인덱스를 생성하는 것은 (a1), (a1, a2) 및 (a1, a2, a3) 세 개의 인덱스를 생성하는 것과 같습니다. 원칙.
3.5. 인덱싱에 적합하지 않은 시나리오는 무엇인가요?
(1) 교착 상태 로그에서 엔진 innodb 상태를 확인합니다.
(2) 교착 상태 Sql
(3) SQL 잠금 상황 분석
(4) 교착 상태 시뮬레이션
(5) 교착 상태 분석 잠금 로그
(6) 교착 상태 결과 분석
(1) 비관적 잠금:
비관적 잠금은 한마음이고 안전하지 않습니다. 그녀의 마음은 현재 거래에만 속하며, 그녀는 자신이 사랑하는 데이터가 다른 거래에 의해 수정될 수 있다는 것을 항상 걱정하므로 거래를 소유한 후( 비관적 잠금을 획득하는 경우 다른 트랜잭션은 데이터를 수정할 수 없으며 실행하기 전에 잠금이 해제될 때까지만 기다릴 수 있습니다.
(2) 낙관적 잠금:
낙관적 잠금의 "낙관주의"는 데이터가 너무 자주 변경되지 않을 것이라고 믿는다는 사실에 반영됩니다. 따라서 여러 트랜잭션이 동시에 데이터를 변경할 수 있습니다.
구현 방법: 낙관적 잠금은 일반적으로 버전 번호 메커니즘이나 CAS 알고리즘을 사용하여 구현됩니다.
MVCC(Multiversion Concurrency Control), 즉 다중 버전 동시성 제어 기술입니다.
MySQL InnoDB에서 MVCC 구현은 주로 데이터베이스 동시성 성능을 향상시키고 읽기-쓰기 충돌을 처리하는 더 나은 방법을 사용하므로 읽기-쓰기 충돌이 있는 경우에도 잠금 및 비차단 동시 읽기가 달성될 수 없습니다. .
원자성: 트랜잭션은 전체적으로 실행되며, 여기에 포함된 데이터베이스의 모든 작업은 실행되거나 전혀 실행되지 않습니다.
일관성: 거래 시작 전과 거래 종료 후에도 데이터가 파기되지 않음을 의미합니다. A 계좌가 B 계좌로 10위안을 이체하는 경우 A와 B의 총액은 성공 여부에 관계없이 변경되지 않습니다.
격리: 여러 트랜잭션이 동시에 액세스할 때 트랜잭션은 서로 격리됩니다. 즉, 하나의 트랜잭션이 다른 트랜잭션의 실행 효과에 영향을 주지 않습니다. 한마디로 말하면, 일들 사이에 갈등이 없다는 뜻이다.
지속성: 트랜잭션이 완료된 후 트랜잭션으로 인해 데이터베이스에 대한 작업 변경 사항이 데이터베이스에 영구적으로 저장됨을 나타냅니다.
읽기 커밋됨
읽기 커밋됨
반복 읽기
직렬화 가능
Mysql 기본 트랜잭션 격리 수준은 반복 읽기
트랜잭션 A와 B가 교대로 실행됩니다. 트랜잭션 A가 트랜잭션 B의 커밋되지 않은 데이터를 읽기 때문에 트랜잭션 A가 트랜잭션 B의 방해를 받습니다. 이는 더티 읽기입니다.
트랜잭션 범위 내에서 두 개의 동일한 쿼리가 동일한 레코드를 읽었지만 다른 데이터를 반환합니다. 이는 반복 불가능한 읽기입니다.
트랜잭션 A는 범위의 결과 집합을 쿼리하고 다른 동시 트랜잭션 B는 이 범위에 데이터를 삽입/삭제하고 자동으로 커밋합니다. 그런 다음 트랜잭션 A가 동일한 범위를 다시 쿼리하고 두 번의 읽기로 얻은 결과 집합이 다릅니다. 마찬가지로, 이것은 환상의 독서입니다.
문제 해결 프로세스:
(1) top 명령을 사용하여 mysqld에 의한 것인지 또는 다른 이유로 인해 발생하는지 관찰하고 확인합니다.
(2) mysqld로 인해 발생한 경우 processlist를 표시하고 세션 상태를 확인하여 리소스를 소모하는 SQL이 실행되고 있는지 확인합니다.
(3) 소모량이 많은 SQL을 찾아 실행 계획이 정확한지, 인덱스가 누락되었는지, 데이터량이 너무 많은지 살펴보세요.
처리 중:
(1) 이 스레드를 종료하고(CPU 사용량이 감소하는지 관찰)
(2) 해당 조정 수행(예: 인덱스 추가, SQL 변경, 메모리 매개변수 변경)
(3) 다시 시작 다음을 실행합니다. SQL.
기타 상황:
각 SQL 문이 많은 리소스를 소비하지 않지만 갑자기 많은 수의 세션 연결이 들어와 CPU가 급증하는 경우도 가능합니다. 이 경우 애플리케이션으로 분석해야 합니다. 연결 수가 급증하는 이유는 무엇입니까? 그런 다음 연결 수 제한 등 해당 조정을 수행하십시오.
마스터-슬레이브 복제는 5단계로 수행됩니다: (인터넷의 사진)
1단계: 메인 라이브러리의 업데이트 이벤트(업데이트, 삽입, 삭제)가 binlog에 기록됩니다.
2단계: 슬레이브 라이브러리에서 기본 라이브러리로의 연결을 시작합니다.
3단계: 이때 메인 라이브러리는 binlog 덤프 스레드를 생성하고 binlog의 내용을 슬레이브 라이브러리로 보냅니다.
4단계: 라이브러리에서 시작한 후 I/O 스레드를 생성하고, 메인 라이브러리에서 전달된 binlog 내용을 읽고 이를 릴레이 로그에 씁니다.
5단계: SQL 스레드도 생성됩니다. 릴레이에서 로그 내용을 읽어서 Exec_Master_Log_Pos 위치부터 읽기 업데이트 이벤트를 실행하고 업데이트된 내용을 슬레이브 db에 씁니다
마스터-슬레이브 동기화 지연 이유
서버는 클라이언트가 연결할 수 있도록 N개의 링크를 열어두기 때문에 동시에 업데이트 작업이 많이 발생하지만 서버에서 binlog를 읽는 스레드는 하나뿐이므로 슬레이브 서버에서 특정 SQL을 실행하는 데 시간이 조금 더 걸립니다. 시간이 오래 걸리거나 특정 SQL이 테이블을 잠가야 하므로 마스터 서버에 SQL 백로그가 많아지고 슬레이브 서버에 동기화되지 않을 수 있습니다. 이로 인해 마스터-슬레이브 불일치, 즉 마스터-슬레이브 지연이 발생합니다.
마스터-슬레이브 동기화 지연에 대한 솔루션
마스터 서버는 업데이트 작업을 담당하고 슬레이브 서버보다 보안 요구 사항이 높기 때문에 일부 설정 매개변수를 수정할 수 있습니다. sync_binlog=1, innodb_flush_log_at_trx_commit = 1 등 설정 등
더 나은 하드웨어 장치를 슬레이브로 선택하세요.
쿼리를 제공하지 않고 슬레이브 서버를 백업으로 사용하면 해당 측의 부하가 줄어들고 릴레이 로그에서 SQL을 실행하는 효율성이 자연스럽게 높아집니다.
슬레이브 서버를 추가하는 목적은 독서 부담을 분산시켜 서버 부하를 줄이는 것입니다.
하위 데이터베이스 및 테이블 구성표:
수평 하위 데이터베이스: 하나의 데이터베이스에 있는 데이터를 필드 및 특정 전략(해시, 범위 등)에 따라 여러 데이터베이스로 분할합니다.
수평 테이블 분할: 필드 및 특정 전략(해시, 범위 등)에 따라 한 테이블의 데이터를 여러 테이블로 분할합니다.
수직 하위 데이터베이스: 테이블을 기반으로 다양한 테이블이 다양한 비즈니스 소유권에 따라 다양한 데이터베이스로 분할됩니다.
수직 테이블 분할: 필드 기반 및 필드 활동에 따라 테이블의 필드가 여러 테이블(메인 테이블과 확장 테이블)로 분할됩니다.
일반적으로 사용되는 sharding-jdbc 미들웨어:
sharding-jdbc
Mycat
샤딩과 관련하여 발생할 수 있는 문제
거래 질문: 필수 분산 거래 사용
교차 노드 조인 문제: 이 문제는 두 개의 쿼리로 해결될 수 있습니다
교차 노드 수, 순서 기준, 그룹 기준 및 집계 함수 문제: 각 노드에 각각 가져오고 결과는 애플리케이션 측에서 병합됩니다.
데이터 마이그레이션, 용량 계획, 확장 및 기타 문제
ID 문제: 데이터베이스가 분할된 후에는 더 이상 데이터베이스 자체의 기본 키 생성 메커니즘에 의존할 수 없습니다. 가장 쉬운 방법은 UUID를 고려하는 것입니다.
교차 샤딩 정렬 페이징 문제
추천 학습: mysql 학습 튜토리얼
위 내용은 MySQL 인터뷰 Q&A 모음 (요약 공유)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!