인덱싱의 중요성
인덱스는 열에 특정 값을 가진 행을 신속 하 게 찾을 하는 데 사용 됩니다. 인덱싱 없이 MySQL 1 레코드에서 시작 하 고 해당 행을 찾을 때까지 전체 테이블을 통해 읽을 해야 합니다. 클수록 테이블, 더 많은 시간이 걸립니다. 테이블의 쿼리 열에는 인덱스가 MySQL 신속 하 게 찾을 데이터 파일의 중간 위치에 도달 수 있습니다, 그리고 모든 데이터를 볼 필요가 없습니다. 참고 대부분의 행에 액세스 하려는 경우 순차 읽기는 훨씬 더 빨리 우리가이 시점에서 디스크 검색을 방지 하기 때문에.
신화 사전 찾을 "장" 중국 문자를 사용 하 여 목차를 사용 하지 마십시오, 신화 사전 마지막 페이지를 찾을 수의 첫 번째 페이지를 할 수 있습니다, 그리고 2 시간 비용이 있습니다. 두꺼운 사전, 더 많은 시간을 지출. 이제 목차를 사용 하 여 찾을 "장" 자를 장의 첫 글자는 z, 중국의 z 시작이이 단서와 900 개 이상의 페이지에서 문자, 중국 문자 수 있습니다만 분 보면,이 인덱스의 중요성을 보여줍니다. 하지만 인덱스를 구축 하는 더, 더, 물론, 책의 카탈로그를 여러 단계로 나누어, 경우 내가 생각 하지 희미 한 것입니다.
Ii입니다. 준비
두 개의 테스트 시트 mysql 준비 > CREATE TABLE 'test_t' ( -> 'id' int NOT NULL auto_increment -> 'num' int NOT NULL 기본 '0' 'd_num'-> varchar NOT NULL 기본 '0' 기본 키-> (이 하 ' id') ->) 엔진 MyISAM 기본 CHARSET = utf8 AUTO_INCREMENT = = 1; OK 검색어, 0 행이 영향을 (0.05 초) mysql > CREATE TABLE 'test_test' (-> 'id' int NOT NULL auto_increment,-> 'Num ' int NOT NULL 기본 '0'-> 기본 키 (이 하 ' id')->) 엔진 MyISAM = 기본 CHARSET = utf8 AUTO_INCREMENT = 1; ok 검색어, 0 행 (0.05 초) //Create 저장된 프로시저에 영향을 편리한 데이터를 mysql을 삽입 > 구분 기호 | mysql > 만들기 프로시저 i_test (Pa int) (varchar 탭)-> 시작-> max_num int 선언 기본 100000;-> 나 int 선언 0 기본;-> rand_num를 선언 int; & nbSp; -> double_num char를 선언;-> 경우-> 탭! = 'test_test' 다음 -max_num에 선택 카운트 (ID) test_t;에서-> 동안 < 펜 실바 니 아-> 할 경우 다음 max_num < 100000 -> 캐스트 선택 (rand () * 100으로 서명 되지 않은) rand_num;에 -> 선택Concat (rand_num, rand_num)에 double_num;-> 테스트에 삽입 _t (Num, d_num) (rand_num, double_num) 값;-> 경우;-> 내가 설정 = i + 1; 끝 동안;-> -> 다른-> test_test;에서 max_num에 수 (ID)을 선택 동안-> < 파 마 -> 경우 max_num < 100000 다음-> 캐스트 선택 (rand () * 100으로 서명 되지 않은)에 rand_num;-> 삽입 test_test (숫자) 값 (rand_num); -> 끝 면;-> 내가 설정 = i + 1;-> 끝 동안;-> 끝 면; -& gt; 끝 | 쿼리 확인, 0 행이 영향을 (0.00 초) mysql > 구분 기호; mysql > 보기 같은 변수 "% 프로 %"; //check 기록 실행 프로 파일링은 시작 하지, 기본값은 오픈 +---+---+ | Variable_name | 값 | + ---+---+ | 프로 파일링 | OFF | | profiling_history_size | 15 | | protocol_version | 10| | slave_compressed_protocol | OFF | +---+---+ 집합된 (4 행 0.00 &NBSP; 초) mysql > 프로 파일링 설정 = 1; 열 인덱싱 후 쿼리 실행 시간을 비교 하는 //is. 좋아, 0 행의 영향을 (0.00 초)
Iii입니다. 예제
1, 단일 테이블 데이터가 너무 작습니다, 그리고 색인 속도 영향을 미칠 것 이다
Mysql > test_t 테이블에 //insert 10 조각 i_test ('test_t')를 호출 쿼리 확인, 1 행의 영향을 (0.02 초) mysql > test_t에서 num을 선택 어디 num! = 0; mysql > test_t에서 선택 num 설명 어디 num! = 0 G; * * * 1. 행 * * * id: 1 select_type: 간단한 테이블: test_t 유형: 모든 possible_keys: NULL 키: key_len NULL: NULL ref: null 행: 10 추가: 사용 하 여 어디설정 (0.00 초)에 1 행 오류: 지정 된 없음 쿼리 mysql > test_t (num);에 인덱스 num_2를 만드는 쿼리 좋아, 10 행 (0.19 초) 레코드 영향: 10 중복: 0 경고: 0 mysql > 선택 test_t에서 num 어디 num! = 0; mysql > test_t에서 선택 num 설명 어디 num! = 0 G; * * * 1. 행 * * * id: 1 select_type: 간단한 테이블: test_t 유형: possible_keys 지 수: num_2 키: num_2 key_len: 4 심판: null 행: 10 추가: 어디에;를 사용 하 여 설정 (0.00 초)에 1 행 인덱스를 사용 하 여 오류: 지정 된 없음 쿼리 mysql > 프로 파일; 보기 +---+-----+ ---+ | Query_ID | 기간 | 쿼리 & nbsp; | +---+-----+ ---+ | 1 | 0.00286325 | 전화 i_test ('test_t') | //Insert 10 데이터 | 2 | 0.00026350 | 선택 test_t에서 num 어디 num! = 0 | | 3 | 0.00022250 | test_t에서 선택 num 설명 어디 num! = 0 | | 4 | 0.18385400 | 인덱스 만들기 test_t에 num_2(num) | //CREATE 인덱스 | 5 | 0.00127525 | 선택 test_t에서 num 어디 num! = 0 | //use 인덱스, 인덱스는 사용 되지 않습니다 거의 0.2 배 시간 | 6 | 0.00024375 | test_t에서 선택 num 설명 어디 num! = 0 | +---+------+ + 설정 (0.00 초)에서 6 행
설명:
ID: SQL 실행 순서를 나타냅니다.
Select_type:simple, 기본, 연합, 종속 동맹, 연합 결과, 종속 하위 쿼리, 하위 쿼리 파생 된 다른 쿼리 문을 다른 select_type를 해야한다합니다
테이블: 조회의 이름을 나타냅니다.
유형: 인덱스 사용, 또는 사용 색인. 효율성 높은 const, 낮은 EQ_REG, ref, 범위, 인덱스 및 모두, 실제로, 당신의 sql이 루트에서 직접 관련 글, 예: 기본 키에 기본 키를 사용할 수 있습니다 어디 인덱스, 후 조건 경우 유일한 플러스 고유 인덱스와에
Possible_keys: 가능한 인덱스
인덱스를 사용 하 여 키:
Key_len: 인덱스의 길이 사용 하 여
Ref: 열 또는 상수를 키 테이블에서 행을 선택 하는 일반적으로 여러 테이블에 연결 된 쿼리를 사용 합니다.
발견 하는 행의 행: 수
엑스트라: 추가 메모
잠시 전에 쓴 별개 MySQL에 대 한 블로그를 누가 더 나은, 거기 있는 친구 메시지, 그룹 말했다 내가 테스트 결과 테스트 결과 루트는, 오늘 시간, 상황, 인덱스의 작동 원리의 더 직관적인 식의 경우는 설명 했다 그 시간에 다른.
2, 후 어디 조건, 주문에 의해, 그룹 하 고에 선호 인덱스 다음과 같은 필드를 필터링 합니다. 실제 상황에 따라 기본 키, 고유 인덱스 인덱스를 선택 하지 더 나은, 온건 하지만, 등.
3, 통합 쿼리, 하위 쿼리 및 다른 테이블 작업 때 색인에 연결 된 필드
Mysql > 호출 i_test ('test_test') //insert 10 데이터 Test_test 테이블에 검색어 좋아, 1 행의 영향을 (0.02 초) mysql > num1,b.num에서 num2로 선택 a.num 설명 b로 왼쪽된 조인 tes t_test로 test_t a.num=b.numg; * * * 1. 행 * * * id: 1 select_type: 간단한 표: 형식: 색인 possible_keys: null 키: num_2 key_len: 4 심판: NULL 행: 10 & NBsp; 추가: 인덱스를 사용 하 여 * * * 2. 행 * id: 1 select_ 종류: 단순 테이블: b 타입: ref possible_keys: num_1 키: num_1 key_len: 4 ref: bak_test.a.num //bak _test 데이터베이스 이름, A.num는 test_t 필드 행: 1080 추가: 세트 (0.01 초)에 2 행 인덱스를 사용 하 여 오류: 지정 된 없음 쿼리
그들 색인 하는 경우에 데이터의 볼륨은 특히 큰 때 그것 연결 된 쿼리를 사용 하지 않기 위하여 최상 이다.
그것은 단지 약간 개인 요약입니다.