집 >데이터 베이스 >MySQL 튜토리얼 >mysql 느린 쿼리가 영향을 줍니까?
MySQL 느린 쿼리가 영향을 미치는 이유는 다음과 같습니다. 1. 인덱스가 없거나 인덱스가 사용되지 않습니다. 2. 낮은 IO 처리량으로 인해 병목 현상이 발생합니다. 3. 메모리가 부족합니다. 5. . 한 쿼리의 데이터 양이 너무 많습니다. 6. 교착 상태가 발생합니다.
이 튜토리얼의 운영 환경: Windows 7 시스템, mysql 버전 8.0.22, DELL G3 컴퓨터 이 방법은 모든 브랜드의 컴퓨터에 적합합니다.
관련 무료 학습 권장사항: mysql 비디오 튜토리얼
mysql 느린 쿼리가 영향을 미칩니다.
쿼리가 느린 일반적인 이유는 다음과 같습니다.
1. 인덱스가 없거나 인덱스가 사용되지 않습니다.
PS: 인덱스는 특정 값을 가진 레코드를 빠르게 찾는 데 사용됩니다. 모든 MySQL 인덱스는 B-트리 형식으로 저장됩니다. 인덱스가 없는 경우 쿼리를 실행할 때 MySQL은 요구 사항을 충족하는 레코드를 찾을 때까지 첫 번째 레코드부터 시작하여 전체 테이블의 모든 레코드를 검색해야 합니다. 테이블의 레코드 수가 많을수록 이 작업 비용이 높아집니다. 검색 조건으로 사용된 컬럼에 인덱스가 생성되면 MySQL은 레코드를 스캔하지 않고도 대상 레코드의 위치를 빠르게 가져올 수 있습니다. 테이블에 1000개의 레코드가 있는 경우 인덱스를 통해 레코드를 찾는 것이 레코드를 순차적으로 스캔하는 것보다 최소 100배 빠릅니다.
색인 유형:
일반 색인: 고유성 등의 제한이 없는 가장 기본적인 색인 유형입니다.
고유 인덱스: 기본적으로 일반 인덱스와 동일하지만 모든 인덱스 열은 고유성을 유지하기 위해 한 번만 나타날 수 있습니다.
기본 키: 기본 키는 고유한 인덱스이지만 "PRIMARY KEY"로 지정해야 합니다.
전체 텍스트 인덱스: MYSQL은 3.23.23부터 전체 텍스트 인덱스와 전체 텍스트 검색을 지원합니다. MYSQL에서 전체 텍스트 인덱스의 인덱스 유형은 FULLTEXT입니다. VARCHAR 또는 TEXT 유형 열에 전체 텍스트 인덱스를 만들 수 있습니다.
2. 작은 IO 처리량으로 인해 병목 현상이 발생합니다.
PS: 이는 MYSQL이 더 많은 IO를 소비한다는 시스템 계층의 분석입니다. 일반 데이터베이스 모니터링도 IO에 더 많은 관심을 기울입니다.
모니터링 명령: $iostat -d -k 1 10
Parameter -d는 장치(디스크) 사용 상태를 표시하는 것을 의미합니다. -k 블록을 단위로 사용하는 일부 열은 강제로 킬로바이트를 단위로 사용합니다. 표시 데이터 1초마다 갱신되어 총 10회 표시됩니다.
3. 메모리 부족
메모리 사용량 모니터링: vmstat [-n] [지연 [횟수]]
Memory
swpd: 스왑 메모리의 메모리로 전환(기본값: KB)
• swpd의 값은 0이 아니거나 100M 이상과 같이 비교적 큰 값이지만 si 및 so의 값은 오랫동안 0이므로 이 상황에 대해 걱정할 필요가 없으며 영향을 미치지 않습니다. 시스템 성능.
free: 물리적 메모리를 확보합니다.
buff: 버퍼 캐시 메모리로 사용, 블록 장치의 읽기 및 쓰기를 버퍼링
cache: 페이지 캐시 메모리로 사용, 파일 시스템 캐시 • 캐시 값이 큰 경우 설명합니다. 자주 액세스하는 모든 파일을 캐시할 수 있는 경우 디스크의 읽기 IO BI는 매우 작습니다.
4. 네트워크 속도가 느립니다
IP -t를 핑하여 패킷 손실이 있는지 확인합니다.
5. 한 쿼리의 데이터 양이 너무 많습니다.
예를 들어 페이징 쿼리가 없고, 한 번에 수만 개의 레코드를 추출할 수 있습니다. 데이터베이스가 중단되었을 수 있습니다.
6. 교착상태가 발생합니다
둘 이상의 프로세스가 실행 과정에서 자원 경쟁으로 인해 서로 기다리는 현상을 말합니다.
innodb 상태를 표시하여 엔진 상태를 확인하면 어떤 문이 교착 상태를 일으키는지 확인할 수 있습니다.
show processlist를 실행하여 교착 상태 스레드 번호를 찾으세요. 그러면 Kill processNo
7. 불필요한 행이나 열이 반환됩니다.
일반 쿼리 SQL 문에서는 필드를 명확하게 지정해야 합니다. 쿼리에 *를 사용하지 마세요
8. UNion과 UNion all의 차이점에 주의하세요. UNION all is good
UNION은 테이블 연결 후 중복 레코드를 필터링하므로 테이블 연결 후 생성된 결과 집합을 정렬하고 중복 레코드를 삭제한 후 결과를 반환합니다. 그러므로 모두의 연합의 효율성이 높아야 합니다!
위 내용은 mysql 느린 쿼리가 영향을 줍니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!