MySQL 인덱스 의 실 효 를 초래 하 는 일반적인 문법 요약

머리말
최근 에는 기 존 프로젝트 에 남 겨 진 SQL 최적화 문 제 를 처리 하 느 라 바 빴 다.당초 표 의 디자인 과 필드 디자인 문제 로 인해 업무 가 증가 하면 서 느 린 SQL 이 대량으로 등장 하여 MySQL 의 CPU 자원 이 급증 했다.이 를 바탕 으로 사용 하기 쉬 운 학습 과 사용 경험 을 간단하게 공유 할 수 있다.
이번 말 은 간단하게 당신 의 색인 이 효력 을 잃 지 않도록 하 는 방법 을 말 해 보 세 요.
그리고 그 전에 저 는 최근 의 경험 에 따라 색인 에 대한 생각 을 말씀 드 리 겠 습 니 다.그래서 표 가 모두 색인 을 만들어 야 하 는 것 이 아니 라 일부 업무 데이터 에 대해 양 이 많 을 수 있 습 니 다.데 이 터 를 조회 하 는 데 부담 이 생 겼 습 니 다.그러면 가장 간단 하고 빠 른 방법 은 적당 한 색인 을 만 드 는 것 이 라 고 생각 합 니 다.그러나 일부 업무 표 에 데이터 가 별로 없 을 수도 있 습 니 다.또는 표 의 사용 빈도 가 매우 높 지 않 은 경우 에는 반드시 색인 을 만들어 야 할 필요 가 없다.우리 의 일부 표 처럼 2 년 이면 10 여 개의 데이터 가 있 을 것 이 고 색인 과 색인 이 없 는 성능 에 있어 서 차이 가 많 지 않다.
색인 은 우리 가 업 무 를 최적화 하 는 방식 일 뿐,색인 을 만 들 기 위해 색인 을 만 들 기 위해 서 는 절대 안 됩 니 다.
다음은 제 가 이번 테스트 에 사용 한 표 구조 와 테스트 데이터 입 니 다.

CREATE TABLE `user` (
 `id` int(5) unsigned NOT NULL AUTO_INCREMENT,
 `create_time` datetime NOT NULL,
 `name` varchar(5) NOT NULL,
 `age` tinyint(2) unsigned zerofill NOT NULL,
 `sex` char(1) NOT NULL,
 `mobile` char(12) NOT NULL DEFAULT '',
 `address` char(120) DEFAULT NULL,
 `height` varchar(10) DEFAULT NULL,
 PRIMARY KEY (`id`),
 KEY `idx_createtime` (`create_time`) USING BTREE,
 KEY `idx_name_age_sex` (`name`,`sex`,`age`) USING BTREE,
 KEY `idx_ height` (`height`) USING BTREE,
 KEY `idx_address` (`address`) USING BTREE,
 KEY `idx_age` (`age`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=261 DEFAULT CHARSET=utf8;

INSERT INTO `bingfeng`.`user`(`id`, `create_time`, `name`, `age`, `sex`, `mobile`, `address`, `height`) VALUES (1, '2019-09-02 10:17:47', '  ', 22, ' ', '1', '        ', '175');INSERT INTO `bingfeng`.`user`(`id`, `create_time`, `name`, `age`, `sex`, `mobile`, `address`, `height`) VALUES (2, '2020-09-02 10:17:47', '  ', 13, ' ', '1', NULL, '180');INSERT INTO `bingfeng`.`user`(`id`, `create_time`, `name`, `age`, `sex`, `mobile`, `address`, `height`) VALUES (3, '2020-09-02 10:17:48', '  ', 20, ' ', '1', NULL, '180');INSERT INTO `bingfeng`.`user`(`id`, `create_time`, `name`, `age`, `sex`, `mobile`, `address`, `height`) VALUES (4, '2020-09-02 10:17:47', '  ', 20, ' ', '17765010977', '      ', '155');INSERT INTO `bingfeng`.`user`(`id`, `create_time`, `name`, `age`, `sex`, `mobile`, `address`, `height`) VALUES (255, '2020-09-02 10:17:47', '  ', 22, ' ', '            ', NULL, '180');INSERT INTO `bingfeng`.`user`(`id`, `create_time`, `name`, `age`, `sex`, `mobile`, `address`, `height`) VALUES (256, '2020-09-03 10:17:47', '  ', 21, ' ', '', NULL, '167');INSERT INTO `bingfeng`.`user`(`id`, `create_time`, `name`, `age`, `sex`, `mobile`, `address`, `height`) VALUES (257, '2020-09-02 10:17:47', '  ', 20, '', '', NULL, '180');INSERT INTO `bingfeng`.`user`(`id`, `create_time`, `name`, `age`, `sex`, `mobile`, `address`, `height`) VALUES (258, '2020-09-02 10:17:47', '  ', 20, '', '', NULL, '188');INSERT INTO `bingfeng`.`user`(`id`, `create_time`, `name`, `age`, `sex`, `mobile`, `address`, `height`) VALUES (259, '2020-09-02 10:17:47', '  ', 20, '', '', NULL, '180');INSERT INTO `bingfeng`.`user`(`id`, `create_time`, `name`, `age`, `sex`, `mobile`, `address`, `height`) VALUES (260, '2020-09-02 10:17:47', '  ', 22, '', '', NULL, '165');
단일 인덱스
1、사용!=또는<>인덱스 실효

SELECT * FROM `user` WHERE `name` != '  ';
우 리 는 name 필드 에 색인 을 만 들 었 습 니 다.그러나 만약!=또는<>이런 경우 색인 이 효력 을 잃 고 전체 표 스 캔 을 할 수 있 으 므 로 데이터 양 이 많 으 면 조심스럽게 사용 하 십시오.

SQL 분석 을 통 해 알 수 있 듯 이 type 형식 은 ALL 이 고 10 줄 의 데 이 터 를 스 캔 하여 전체 표 스 캔 을 진행 하 였 습 니 다.<>같은 결과 다.
2.유형 불일치 로 인 한 색인 실효
이 말 을 하기 전에 디자인 표 필드 를 꼭 말 해 야 할 때 제발,꼭,필드 유형의 일치 성 을 유지 해 야 합 니 다.무슨 뜻 입 니까?예 를 들 어 user 표 의 id 는 int 가 증가 하고 사용자 의 계 정 표 userid 이 필드 는 반드시 int 형식 이 어야 합 니 다.varchar,char 같은 소 동작 으로 쓰 지 마 십시오.

SELECT * FROM `user` WHERE height= 175;
이 SQL 여러분 은 잘 보 셔 야 합 니 다.height 표 필드 유형 은 varchar 입 니 다.그러나 제 가 조회 할 때 디지털 형식 을 사 용 했 습 니 다.이 중간 에 암시 적 인 형식 전환 이 존재 하기 때문에 색인 이 효력 을 잃 고 전체 표 스 캔 을 할 수 있 습 니 다.

이제 내 가 왜 디자인 필드 를 말 할 때 반드시 유형의 일치 성 을 유지 해 야 하 는 지 알 겠 다.
이런 시 계 를 만나면 그 안에 수천 만 개의 데이터 가 있 고 고 칠 수도 없고 고 칠 수도 없다.그 고통 은 아마 너희들 이 잠시 느 낄 것 이다.
소년 들 아,명심 해라,명심 해라.
3.함수 로 인 한 색인 실효

SELECT * FROM `user` WHERE DATE(create_time) = '2020-09-03';
만약 당신 의 색인 필드 에 색인 을 사용 했다 면,맞 출 수 없습니다.그 는 정말 색인 을 가지 않 습 니 다.

4.연산 자 에 의 한 색인 실효

SELECT * FROM `user` WHERE age - 1 = 20;
만약 당신 이 열 에 대해 진행 했다 면(+,-,*,/!),그럼 색인 을 찾 지 않 을 겁 니 다.

5、OR 로 인 한 인덱스 실효

SELECT * FROM `user` WHERE `name` = '  ' OR height = '175';
OR 로 인 한 색인 은 특정한 상황 에서 발생 합 니 다.모든 OR 가 색인 을 무효 로 하 는 것 이 아 닙 니 다.OR 가 같은 필드 에 연결 되 어 있 으 면 색인 이 효력 을 잃 지 않 고 색인 이 효력 을 잃 지 않 습 니 다.

6.퍼 지 검색 으로 인 한 색인 실효

SELECT * FROM `user` WHERE `name` LIKE '% ';
이것 은 모두 가 알 고 있 을 것 이 라 고 믿 습 니 다.모호 한 검색 은 접두사 도 모호 한 검색 을 한다 면 색인 을 가지 않 을 것 입 니 다.

7.NOT IN,NOT EXISTS 로 인 한 색인 실효

SELECT s.* FROM `user` s WHERE NOT EXISTS (SELECT * FROM `user` u WHERE u.name = s.`name` AND u.`name` = '  ')

SELECT * FROM `user` WHERE `name` NOT IN ('  ');
이 두 가지 용법 도 색인 을 무효 로 할 것 이다.그러나 NOT IN 은 색인 을 가 는 것 입 니 다.절대 IN 이 모두 색인 을 가지 않 는 다 고 오해 하지 마 세 요.나 는 전부터 오해 가 있 었 다.

8.IS NULL 은 색인 을 가지 않 고 IS NOT NULL 은 색인 을 가지 않 습 니 다.

SELECT * FROM `user` WHERE address IS NULL

색인 을 가지 않 습 니 다.

SELECT * FROM `user` WHERE address IS NOT NULL;

색인 을 뜨다.
이 상황 에 따라 필드 를 디자인 할 때 필요 한 요구 가 없 으 면 NULL 이 어야 합 니 다.기본 값 의 빈 문자열 을 주 는 것 이 좋 습 니 다.이것 은 많은 후속 적 인 번 거 로 움 을 해결 할 수 있 습 니 다(깊 은 체험<체험=교훈>이 있 습 니 다).
일치 색인
1.최 좌 일치 원칙

EXPLAIN SELECT * FROM `user` WHERE sex = ' ';

EXPLAIN SELECT * FROM `user` WHERE name = '  ' AND sex = ' ';
테스트 전에 다른 단일 색인 을 삭제 합 니 다.
가장 왼쪽 일치 원칙 이란 색인 에 부합 되 는 것 입 니 다.색인 의 순 서 는 왼쪽 에서 오른쪽으로 순서대로 비교 하 는 것 입 니 다.두 번 째 검색 어,name 에서 색인 을 찾 은 다음 에 age 를 찾 습 니 다.결과 조건 에 age 가 없 으 면 뒤의 sex 도 색인 을 찾 지 않 습 니 다.

주의:

SELECT * FROM `user` WHERE sex = ' ' AND age = 22 AND `name` = '  ';
아마도 일부 벽돌공 들 은 나 와 처음에 오해 가 있 었 을 것 이다.우리 의 색인 순 서 는 분명히 name,sex,age 이다.너의 현재 검색 순 서 는 sex,age,name 이다.이것 은 틀림없이 색인 을 가지 않 을 것 이다.네가 만약 에 테스트 를 하지 않 았 다 면 이런 성숙 하지 않 은 생각 도 있 었 을 것 이다.그것 은 나 와 마찬가지 로 너무 젊 었 다.그것 은 사실 순서 와 아무런 관계 가 없다.my sql 의 밑바닥 은 우리 에 게 최적화 시 켜 줄 것 이기 때문에 SQL 을 효율 이 가장 높다 고 생각 하 는 모습 으로 최적화 시 켜 집행 할 것 입 니 다.그 러 니까 그런 오해 하지 마.
2、사용 하면!=뒤에 있 는 색인 이 모두 효력 을 잃 을 수 있 습 니 다.

SELECT * FROM `user` WHERE sex = ' ' AND `name` != '  ' AND age = 22;
우 리 는 name 필드 에서 사 용 했 습 니 다!=,name 필드 는 가장 왼쪽 필드 이기 때문에 가장 왼쪽 일치 원칙 에 따라 name 이 색인 을 가지 않 으 면 뒤의 필드 도 색인 을 가지 않 습 니 다.

색인 에 부합 되 어 색인 이 효력 을 잃 는 상황 에 대해 말 할 수 있 는 것 은 현재 이 두 가지 입 니 다.사실은 색인 에 부합 되 는 데 중요 한 것 은 어떻게 효율 적 인 색인 을 만 드 는 것 이 라 고 생각 합 니 다.제 가 그 필드 를 사용한다 고 해서 단독 색인 을 만 들 면 전체 적 으로 사용 할 수 있 지 않 습 니까?이렇게 하면 되 지만 색인 효율 에 부합 되 지 않 기 때문에 고급 벽돌 운반 공이 되 기 위해 우 리 는 효율 적 인 색인 을 만 드 는 방법 을 계속 배 워 야 한다.
총결산
MySQL 인덱스 의 실 효 를 초래 하 는 흔 한 문법 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.MySQL 인덱스 의 실효 에 관 한 흔 한 문법 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 지원 바 랍 니 다!

좋은 웹페이지 즐겨찾기