>데이터 베이스 >MySQL 튜토리얼 >mysql> 인덱스 오류

mysql> 인덱스 오류

WBOY
WBOY원래의
2023-05-14 10:39:372396검색

MySQL은 널리 사용되는 관계형 데이터베이스 관리 시스템입니다. 개발 중에 인덱스를 사용하면 쿼리 효율성을 높일 수 있지만 때로는 인덱스 오류가 발생하여 쿼리 속도가 느려지거나 인덱스를 사용할 수 없게 되는 경우도 있습니다.

이 글에서는 인덱스 실패의 원인, 인덱스 실패 감지 방법, 인덱스 최적화 방법 및 몇 가지 실제 사례를 소개합니다.

1. 인덱스 실패 이유

  1. 인덱스 열에 함수가 사용되었습니다

예: SELECT * FROM user WHERE DATE_FORMAT(create_time,'%Y-%m-%d')='2021- 01-01' ;

해결 방법: 함수의 연산 결과를 임시 테이블이나 새 테이블에 저장한 후 쿼리합니다.

  1. 인덱스 열 유형 불일치

예: SELECT * FROM user WHERE create_time='2021-01-01';

create_time 필드가 날짜/시간 유형이고 쿼리 조건이 문자 유형인 경우 실패할 인덱스.

해결책: 쿼리 조건 유형을 인덱스 열 유형과 일치하게 유지하세요.

  1. 연산자는 인덱스 열에 사용됩니다

예: SELECT * FROM user WHERE create_time + INTERVAL 1 DAY > NOW();

해결책: 인덱스 열에 연산자 사용을 피하고 먼저 연산을 계산할 수 있습니다. 결과를 다시 쿼리해 보세요.

  1. IS NULL 또는 IS NOT NULL이 인덱스 열에 사용됩니다

예: SELECT * FROM user WHERE create_time IS NULL;

해결책: 공동 인덱스를 사용하거나 쿼리 문을 수정하세요.

  1. 인덱스 열 값이 고르지 않게 분포됩니다.

예: 수백만 개의 데이터가 포함된 테이블의 경우 특정 필드 값의 90%가 동일합니다. 이때 이를 사용하는 모든 쿼리는 동일합니다. 필드가 실패합니다.

해결책: 조인트 인덱스를 사용하거나 커버링 인덱스를 사용하세요.

  1. 데이터 양이 너무 많습니다

예: SELECT * FROM user WHERE name LIKE '%abc%';

해결책: 전체 텍스트 인덱스를 사용하거나 쿼리 조건을 수정하세요.

2. 인덱스 실패 감지 방법

EXPLAIN 키워드를 통해 쿼리문 실행 계획을 확인할 수 있습니다.

예: EXPLAIN SELECT * FROM user WHERE create_time='2021-01-01';

쿼리 결과에 where 사용이 표시되면 인덱스가 유효하지 않으며 최적화가 필요함을 의미합니다.

3. 인덱스 최적화 방법

  1. 조인트 인덱스 만들기

조인트 인덱스는 쿼리 효율성을 높일 수 있는 여러 열로 구성된 인덱스를 말합니다.

예: CREATE INDEX idx_user ON user(create_time, name);

쿼리 순서를 고려해야 합니다. 예를 들어 위 문에서 create_time은 첫 번째 열이고 name은 Create_time이 있어야 합니다. 쿼리 조건에서 이 인덱스를 사용할 수 있습니다.

  1. 커버링 인덱스 만들기

커버링 인덱스는 쿼리 결과를 데이터 테이블이 아닌 인덱스에서만 가져오면 된다는 의미입니다.

예: CREATE INDEX idx_user ON user(create_time) INCLUDE(name);

쿼리할 때 포함해야 할 열을 명확하게 지정해야 하며 인덱스에서 쿼리 결과만 가져오면 되므로 이를 줄일 수 있습니다. 데이터 테이블에 대한 접근 횟수를 줄이고 Query 효율성을 향상시킵니다.

  1. 전체 텍스트 인덱스 사용

전체 텍스트 인덱스는 텍스트 검색 시나리오에 적합한 특수 인덱스입니다.

예: CREATE FULLTEXT INDEX idx_user ON user(name);

MySQL은 영어와 중국어 전체 텍스트 인덱스만 지원하며, 다른 언어에서는 타사 플러그인을 사용해야 한다는 점에 유의해야 합니다.

4. 실제 사례

  1. 인덱스 실패로 인해 쿼리 속도가 느려짐

특정 시스템에 수백만 개의 데이터가 포함된 사용자 테이블이 있는데, 사용자를 쿼리하는 데 사용됩니다.

처음에는 필드에 인덱스가 없었고 쿼리가 매우 느렸습니다. 나중에 이 필드에 인덱스가 추가되어 쿼리 속도가 크게 향상되었습니다.

그러나 시스템이 일정 시간 동안 온라인 상태가 된 후 쿼리 속도가 다시 떨어지는 것을 발견했으며 액세스 로그에 다음과 유사한 기록이 많이 나타납니다.

SELECT * FROM user WHERE name LIKE '%abc %';

By EXPLAIN 키워드 실행 계획을 확인하고 인덱스가 유효하지 않아 최적화가 필요한지 확인합니다.

최종 해결 방법은 필드에 대한 전체 텍스트 인덱스를 만들고 쿼리 문을 수정하는 것입니다. 수정된 쿼리문은 다음과 같습니다.

SELECT * FROM user WHERE MATCH(name) AGAINST('abc');

  1. 인덱스 실패로 인해 쿼리 실행 시간이 너무 길어집니다

특정 시스템에 순서가 있습니다. 주문을 쿼리하는 데 사용되는 create_time 필드를 포함하여 수백만 개의 데이터가 포함된 테이블 주문.

처음에는 필드가 인덱싱되었으며 쿼리 속도는 허용 가능했습니다. 그러나 주문량이 증가함에 따라 쿼리 실행 시간이 점차 증가하고 일부 쿼리가 시간 초과되는 경우도 있습니다.

EXPLAIN 키워드를 통해 실행 계획을 보고 인덱스가 유효하지 않으며 최적화가 필요한지 확인합니다.

최종 해결 방법은 해당 필드에 대한 공동 인덱스를 생성하고 쿼리 문을 수정하는 것입니다. 수정된 쿼리문은 다음과 같습니다.

SELECT * FROM order WHERE create_time='2021-01-01' AND status='SUCCESS';

요약하면 인덱스는 쿼리 효율성을 높이는 중요한 수단이지만 실제 사용에서는 , 인덱스 실패를 방지하는 것이 필요합니다. 인덱스를 감지하고 최적화함으로써 쿼리 효율성을 높이고 최적의 데이터베이스 성능을 달성할 수 있습니다.

위 내용은 mysql> 인덱스 오류의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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