>  기사  >  데이터 베이스  >  MySQL 인덱싱 및 최적화

MySQL 인덱싱 및 최적화

黄舟
黄舟원래의
2017-02-06 10:19:291052검색

1. 인덱스의 데이터 유형 선택

MySQL은 다양한 데이터 유형을 지원하므로 데이터를 저장하는 데 적합한 데이터 유형을 선택하는 것이 성능에 큰 영향을 미칩니다. 일반적으로 다음과 같은 몇 가지 지침을 따를 수 있습니다.

(1) 일반적으로 데이터 유형이 작을수록 좋습니다. 데이터 유형이 작을수록 일반적으로 디스크, 메모리 및 CPU 캐시에서 더 적은 공간이 필요합니다.
(2) 단순한 데이터 유형이 더 좋습니다: 정수 데이터는 문자열 비교가 더 복잡하기 때문에 문자보다 처리 오버헤드가 적습니다. MySQL에서는 문자열 대신 내장된 날짜 및 시간 데이터 유형을 사용하여 시간을 저장하고 정수 데이터 유형을 사용하여 IP 주소를 저장해야 합니다.
(3) NULL을 피하십시오. NULL을 저장하려는 경우가 아니면 열을 NOT NULL로 지정해야 합니다. MySQL에서 null 값이 포함된 열은 인덱스, 인덱스 통계, 비교 연산을 복잡하게 만들어 쿼리를 최적화하기 어렵습니다. null 값을 0, 특수 값 또는 빈 문자열로 바꿔야 합니다.

1.1. 식별자 선택
적절한 식별자를 선택하는 것이 매우 중요합니다. 선택할 때 스토리지 유형뿐만 아니라 MySQL이 작업 및 비교를 수행하는 방법도 고려해야 합니다. 데이터 유형이 선택되면 모든 관련 테이블이 동일한 데이터 유형을 사용하는지 확인해야 합니다.
(1) 정수: 더 빠르게 처리할 수 있고 AUTO_INCREMENT로 설정할 수 있으므로 일반적으로 식별자로 가장 좋은 선택입니다.

(2) 문자열: 문자열을 식별자로 사용하지 마십시오. 문자열은 더 많은 공간을 소비하고 처리 속도가 느려집니다. 또한 일반적으로 문자열은 무작위이므로 인덱스에서의 위치도 무작위이므로 페이지 분할, 디스크에 대한 무작위 액세스 및 클러스터형 인덱스 분할(클러스터형 인덱스를 사용하는 스토리지 엔진의 경우)이 발생할 수 있습니다.

2. 인덱스 소개
모든 DBMS에 있어서 인덱스는 최적화에 있어서 가장 중요한 요소입니다. 데이터의 양이 적을 경우 적절한 인덱스가 없을 때의 영향은 크지 않지만, 데이터의 양이 늘어나면 성능이 급격히 떨어지게 됩니다.
여러 열이 인덱스된 경우(결합 인덱스) 열의 순서가 매우 중요합니다. MySQL은 인덱스의 가장 왼쪽 접두사에서만 효과적인 검색을 수행할 수 있습니다. 예:
결합된 인덱스 it1c1c2(c1,c2)가 있고 쿼리 문 select * from t1 여기서 c1=1 및 c2=2가 이 인덱스를 사용할 수 있다고 가정합니다. 쿼리 문 select * from t1(c1=1인 경우)도 이 인덱스를 사용할 수 있습니다. 그러나 c2=2인 쿼리문 select * from t1은 결합된 인덱스의 선행 컬럼이 없기 때문에 이 인덱스를 사용할 수 없습니다. 즉, c2 컬럼을 검색에 사용하려면 c1이 특정 값과 같아야 합니다.

2.1.인덱스의 종류
인덱스는 서버 계층이 아닌 스토리지 엔진에서 구현됩니다. 따라서 각 스토리지 엔진의 인덱스가 반드시 동일할 필요는 없으며 모든 스토리지 엔진이 모든 인덱스 유형을 지원하는 것은 아닙니다.
2.1.1, B-Tree 인덱스
다음 테이블이 있다고 가정합니다.

CREATE TABLE People (
     last_name varchar(50)    not null,
     first_name varchar(50)    not   null,
     dob        date           not null,
     gender     enum('m', 'f') not   null,
     key(last_name, first_name, dob)
);

해당 인덱스에는 테이블의 각 행에 대한 last_name, first_name 및 dob 열이 포함되어 있습니다. 그 구조는 대략 다음과 같습니다.

MySQL 인덱싱 및 최적화

인덱스에 저장된 값들이 인덱스 열에 순서대로 정렬되어 있습니다. B-Tree 인덱스를 사용하면 모든 키워드, 키워드 범위, 키워드 접두사를 쿼리할 수 있습니다. 물론 인덱스를 사용하려면 인덱스의 가장 왼쪽 접두사를 기준으로 쿼리해야 합니다.
(1) 전체 값 일치: 인덱스의 모든 열에 대해 특정 값을 지정합니다. 예를 들어, 위 사진의 색인은 1960년 1월 1일에 태어난 Cuba Allen을 찾는 데 도움이 될 수 있습니다.
(2) 가장 왼쪽 접두사 일치: 색인의 첫 번째 열만 사용하여 색인을 사용하여 성이 Allen인 사람을 찾을 수 있습니다.
(3) 열 접두사 일치: 예를 들어 색인을 사용하여 성이 J로 시작하는 사람을 찾을 수 있습니다. 이 경우 색인의 첫 번째 열만 사용됩니다.
(4) 값 범위 일치: 색인을 사용하여 성이 Allen과 Barrymore 사이에 있는 사람을 찾을 수 있으며 색인의 첫 번째 열만 사용할 수 있습니다.
(5) 한 부분을 정확하게 일치시키고 다른 부분의 범위를 일치시킵니다. 색인을 사용하여 성이 Allen이고 이름이 문자 K로 시작하는 사람을 찾을 수 있습니다.
(6) 인덱스 전용 쿼리: 쿼리된 열이 모두 인덱스에 있으면 튜플의 값을 읽을 필요가 없습니다.
B-트리의 노드는 순차적으로 저장되므로 인덱스를 이용하여 검색(특정 값 찾기)을 할 수도 있고, 쿼리 결과를 ORDER BY할 수도 있습니다. 물론 B-트리 인덱스를 사용하는 데에는 몇 가지 제한 사항이 있습니다.
(1) 쿼리는 인덱스의 가장 왼쪽 열부터 시작해야 합니다. 이 점은 여러 번 언급되었습니다. 예를 들어, 인덱스를 사용하여 특정 날짜에 태어난 사람을 찾을 수 없습니다.
(2) 인덱스 열은 건너뛸 수 없습니다. 예를 들어, 성이 Smith이고 특정 날짜에 태어난 사람을 찾는 데 인덱스를 사용할 수 없습니다.
(3) 스토리지 엔진은 인덱스의 범위 조건 오른쪽에 있는 열을 사용할 수 없습니다. 예를 들어 쿼리 문이 WHERE last_name="Smith" AND first_name LIKE 'J%' AND dob='1976-12-23'인 경우 LIKE는 범위 쿼리이므로 쿼리는 인덱스의 처음 두 열만 사용합니다. .

위 내용은 MySQL Indexing 및 Optimization 내용입니다. 더 많은 관련 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!


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