mysql 인덱스 및 최적화

인덱스

1. 기본 SQL 문

1. 색인 생성

CREATE  [UNIQUE | FULLTEXT | SPATIAL]  INDEX  索引名 ON  表名(字段名) [USING 索引方法]

2. 색인 삭제

drop index 索引名

3. 색인보기

show index on tablename;

2. 성능 저하 이유

1. 잘못 작성된 쿼리 문
2. 인덱스 오류 : 단일 값 인덱스, 복합 인덱스
3. 너무 많은 조인 (디자인 결함 또는 비 균일 요구 사항)
4. 서버 튜닝 및 다양한 매개 변수 설정 (캐시, 스레드 수)

3. 장점

  1. 쿼리 속도 향상
  2. 정렬 감소

4. 단점

  1. 간격 잠금을 늘리고 데이터 업데이트 속도를 늦 춥니 다.
  2. 시간을내어 최적화 된 인덱스를 작성하십시오.

5. 분류

  1. 단일 값 인덱스 : 단일 열만 포함
  2. 고유 색인 : 색인의 값이 고유하며 비어있을 수 있습니다.
  3. 복합 색인 : 여러 열이있는 색인

6. 검색 원리

  1. B 트리
  2. 해시시
  3. r 나무
  4. 전문

7. 어떤 상황에서 인덱스 생성

  1. 기본 키는 자동으로 인덱싱됩니다 (킹의 사용자 이름과 영역은 공동 기본 키가 아닙니다. 그렇죠 ?? 자주 업데이트하지 마십시오. 사용자 이름과 파티션을 사용하여 추첨을 수행 할 수 있습니다!)
  2. 외래 키 인덱싱
  3. 통계 그룹화 및 정렬에 사용되는 필드 인덱싱
  4. 높은 동시성은 공동 인덱스를 구축하는 경향이 있습니다.
  5. 자주 쿼리되는 필드의 인덱싱

8. 어떤 상황에서 인덱스가 설정되지 않습니까?

  1. 사용자 자신의 프로필과 같이 어디에 사용되지 않는 필드
  2. 자주 업데이트되는 필드는 인덱싱을 의미하지 않습니다.
  3. 테이블에 3 백만 미만의 레코드가 거의 없습니다.
  4. 데이터의 반복률이 너무 높습니다.

9. 성능 분석

1. 설명

  1. 사용하다
  2. 유형
  3. 특별한
  4. 가능한 키
  5. 신분증
  6. 심판

2. 느린 쿼리 로그

4. 배치 데이터 스크립트

5. 쇼 프로필

6. 글로벌 로그 쿼리

7. 일반적인 아이디어

  1. 느린 쿼리 로그를 시작하고 캡처합니다.
  2. 설명 + SQL 분석.
  3. show profile은 서버에서 SQL의 실행 세부 정보와 수명주기를 쿼리합니다.
  4. SQL 데이터 서버의 매개 변수 튜닝.

10. 성능 최적화

1. 단일 테이블 연결

2. 두 개의 테이블이 연결됨

1. 좌우 연결 + 반대 인덱스 (왼쪽 연결 + 오른쪽 테이블, 오른쪽 연결 + 왼쪽 테이블)

3. 3 개 테이블 최적화 사례

  1. 작은 테이블이 큰 테이블을이 끕니다
  2. 먼저 하위 집합 최적화
  3. 조인 테이블에 최적화 된 문이 있는지 확인
  4. 조인 버퍼로 인색하지 마십시오.

4. 인덱스 최적화 원칙

  1. 내가 가장 좋아하는 전체 경기
create index on user a('c', 'd', 'e');
select * from user where c = 'x';  #可以用到索引
select * from user where d = 'y' and  e = 'z' #索引失效了

第二个违背了最佳左前缀法则:
建立索引的第一字段不能丢(索引失效)
建立索引的中间字段不能断(否则部分使用索引)
  1. 인덱스에 대해 함수 작업을 수행하지 마십시오 (계산, 함수, 유형 변환).
select * from user where left(id, 4) = 1;#在索引left上使用了函数

  1. 범위를 사용한 후 모든 무효화, 인덱싱 된 필드를 선택 (선택)하십시오.
select * from user where id = 4 and age > 1 and name = "te";#使用了范围
范围之后的就失效了, id会用到索引,但是age和age之后就会出现索引失效
select id, age, name where id = 4 and age  > 1 and name = "te"#会使用索引,所以仍旧是使用索引
  1. <>,! =, is null, null, is not null, like "% name"등을 사용하면 인덱스가 실패합니다.
select * from name where name like "%name";#索引失效
select * from name where name like "name%";#like 百分在右边

왼쪽을로드해야하는 경우 어떻게합니까?
커버링 인덱스 사용

create index on user idx_name_age(`name`, `age`);
select name, from user where name like "%tea%";
  1. varchar 유형은 작은 따옴표로 묶어야합니다.
select * from name = '3000';
select * from name = 3000;#索引失效
都能查到,但是出现了隐式的类型转换

앞의 맏형은 죽을 수없고, 중형은 깨질 수 없습니다. 퍼센트 기호 뒤에 오는 퍼센트 기호, 문자열 유형은 따옴표로 묶이고 범위 뒤의 모든 것은 유효하지 않습니다.

  1. group by는 임시 테이블을 생성 할 수 있음
  2. 작은 테이블이 큰 테이블을 주도합니다.
select * from A where id in (select id from B);#B表小于大表
select * from A where exists(select id from B);#A表小于大表
exists就是把A中的字段放入子查询寻中进行比较。

추천

출처blog.csdn.net/fuzekun/article/details/104462447