>  기사  >  데이터 베이스  >  mysql 느린 쿼리가 영향을 줍니까?

mysql 느린 쿼리가 영향을 줍니까?

coldplay.xixi
coldplay.xixi원래의
2021-01-06 11:29:293133검색

MySQL 느린 쿼리가 영향을 미치는 이유는 다음과 같습니다. 1. 인덱스가 없거나 인덱스가 사용되지 않습니다. 2. 낮은 IO 처리량으로 인해 병목 현상이 발생합니다. 3. 메모리가 부족합니다. 5. . 한 쿼리의 데이터 양이 너무 많습니다. 6. 교착 상태가 발생합니다.

mysql 느린 쿼리가 영향을 줍니까?

이 튜토리얼의 운영 환경: 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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