벽 균열 추천 : 개발자는 몇 가지 SQL 최적화 점을 배우게됩니다

파란색 "을 클릭 파이썬 공간 "아 내 관심

는 "추가 스타 매일 함께 '행복 학습


来源:https://www.cnblogs.com/xiaoyangjia/p/11267191.html


프로젝트 중심으로 알리 클라우드 데이터베이스의 MySQL에 대한 책임 블로거, SQL 최근의 느린 경보 5 분, 자주 심지어 가장 긴 실행 시간을 발생합니다. 수출 로그 분석 후에는 주요 원인으로 밝혀졌다 치지없이 인덱스 페이징 과정 . 사실,이 매우 낮은 수준의 에러는, 내가 도움이되지만 다시 멋진 할 수없는, 팀 구성원의 요구 기술 수준 향상 아합니다. 오류 환영 비판이있는 경우 이러한 SQL의 변화의 과정은 당신에게 공유에 대한 경험을 요약.

01

MySQL의 성능

1. 최대 데이터 량

데이터의 양 및 왕따의 성능에 대한 동시, 이야기의 수에도 불구하고 . MySQL은 하나의 테이블에있는 레코드의 최대 수에 대한 제한, 그것은 파일 크기의 운영 체제의 제한에 따라되지 않습니다.

파일 시스템 단일 파일 크기 제한
FAT32 가장 큰 4G
NTFS 최대 64기가바이트
NTFS5.0 최대의 2TB
EXT2 블록 크기는 1024 바이트, 16 기가 바이트 파일의 최대 용량이며, 4096 바이트의 블록 크기, 파일 2TB의 최대 용량
EXT3 블록 크기는 4킬로바이트, 파일 4TB의 최대 용량
EXT4 이론은 16TB보다 클 수 있습니다

"알리 바바 자바 개발 매뉴얼 '5 백만 선 또는 2GB 이하 이상 단일 테이블 능력을 통해 앞으로 하나의 테이블 행을 넣어, 그것은 권장 서브 라이브러리 하위 테이블. 성능이 따로 비즈니스의 복잡성을 넣어 요인의 조합에 의해 결정된다, 영향은 하드웨어 구성, MySQL의 구성, 데이터 테이블 설계, 인덱스 최적화옵니다. 5000000이 값은없는 철 법률, 참조 용으로 만 것입니다.

블로거 최신 (20 개) 기록을 확인, 하나의 테이블을 통해 데이터, 페이징 만 400 행을 운영하고있다 0.6 초 정도 걸립니다, SQL 문은 일반적으로

select field_1,field_2 from table where id < #{prePageMinId} order by id desc limit 20

prePageMinId ID는 이전 데이터 기록의 최소이다. 데이터가 지속적으로 성장하고 같은 시간에, 쿼리 속도가 좋아, 어느 날은 압도해야합니다. 하위 라이브러리 하위 테이블이 오랜 기간 큰 위험이 높은 작업, 당신은 등 업그레이드 하드웨어, 마이그레이션 이력 데이터, 그것은 Meizhe 세분로, 현재의 구조를 최적화하기 위해 시도해야합니다.

관심있는 학생들을위한 하위 라이브러리 하위 테이블은 하위 라이브러리 하위 테이블의 기본 개념을 읽을 수 있습니다 :

https://www.cnblogs.com/jshen/p/7682502.html


동시 2. 최대 수

동시 데이터베이스의 수는 요청의 수 처리를 동시에 참조 할 수는 MAX_CONNECTIONS 및 MAX_USER_CONNECTIONS에 의해 결정된다.

연결 MAX_CONNECTIONS MySQL의 인스턴스의 최대 개수를 나타낸다 상한값은 16384이고, MAX_USER_CONNECTIONS 사용자 당 데이터베이스 연결의 최대 수이다.

MySQL은 메모리 소비 수단을 각각 접속하는 버퍼를 제공한다. 연결이 너무 많이 너무 높은 하드웨어를 설정하는 경우, 너무 낮과 하드웨어를 최대한 활용할 수 없습니다. 다음과 같은 비율 모두에 대한 일반 요구 사항 계산, 10 %를 초과 :

최대 _used_ 연결 / MAX_CONNECTIONS는 * 100 % = 3/100 * 100 % 3 % ≈

연결 및 연결 응답 최대 수의 최대 수를보기 :

show variables like '%max_connections%';show variables like '%max_user_connections%';
在配置文件 my.cnf 中修改最大连接数

[mysqld]max_connections = 100max_used_connections = 20


3. 쿼리는 0.5 초 걸렸습니다

단일 쿼리는 0.5 초 미만에 장악하는 것이 좋습니다, 0.5 초는 사용자 경험에서 경험이다 삼초 원칙 . 사용자의 동작을 3 초 내에 응답하지 않는 경우에도 밖으로 지루함 것이다. 응답 시간은 = UI 렌더링 클라이언트 네트워크 요청은 데이터베이스 쿼리를 소비하는 과정을 소모 가공 + + + 응용 프로그램, 처리 시간은 0.5 초 1/6 데이터베이스를 남아있다 가공.


원칙 4. 구현

비교되는 NoSQL 데이터베이스는 MySQL은 섬세하고 연약한 사람이다. 그것은 체육의 여학생처럼, 그리고 주장하는 학생들의 작은 분쟁 (확장 어려운), 호흡 (저용량 작은 동시)에서 두 단계를 실행 종종 병 (너무 많은 SQL 제약을) 떠날.

오늘 우리는 분산 응용 프로그램의 확장, 데이터베이스보다 훨씬 쉽게 지적 할 것이다 원칙의 구현 때문에 데이터베이스 적은 작업, 더 많은 작업 응용 프로그램 .

  • 그러나 남용 인덱스를 최대한 활용하지 않는 인덱스 노트는 디스크와 CPU를 소모한다.

  • 응용 프로그램 프로세스에 데이터를 포맷하는 데이터베이스 기능을 사용하지 않는 것이 좋습니다.

  • 응용 프로그램과 데이터의 정확성을 보장하기 위해 외래 키 제약 조건을 사용하는 것을 권장하지 않습니다.

  • 읽기 많은 작은 장면 일단 쓰기가 고유 인덱스를 사용하지 않는 것이 좋습니다, 고유성을 보장하기 위해 응용 프로그램을 사용합니다.

  • 적절한 중복 필드, 중간 테이블, 시간에 대한 응용 프로그램, 공간 계산의 중간 결과를 만들어보십시오.

  • 작은 트랜잭션으로 응용 프로그램 분할로, 매우 시간이 많이 소요되는 업무를 수행 할 수 없습니다.

  • 중요한 기준 (예 순번 표 등)의 데이터 시트로드 데이터 증가 최적화 진행.


02

데이터 테이블 디자인

1. 데이터 유형

단순 또는 더 작은 풋 프린트 : 원칙 데이터 유형을 선택합니다.

  • 길이가 충족 될 수 있다면, int로하지 medium_int, 정수 TINYINT, SMALLINT의 사용을 확인합니다.

  • 문자열 길이가 결정되면, 문자 유형을 사용하여.

  • VARCHAR 충족하는 경우, 텍스트 형식을 사용하지 않고.

  • 고정밀 소수점 형식의 사용은 또한 BIGINT 같은 소수점 이하의 정밀도를 저장 (100)에 의해 승산이 사용될 수있다.

  • 날짜 대신에 타임 스탬프를 사용해보십시오.

유형 바이트를 점령 기술
날짜 시간 8 바이트 '1000년 1월 1일 00 : 00 : 00.000000'에 9999-12-31 23 : 59 : 59.999999
타임 스탬프 4 바이트 '1970-01-01 00 : 00 : 01.000000'에서 '2038년 1월 19일 03 : 14 : 07.999999'

적은 공간을 차지 타임 스탬프, 날짜 비교, 저장 영역은 자동으로 UTC 시간 형식으로 변환됩니다.


2. 않도록 널 (null)

분야에서 MySQL은 인덱스, 더 복잡한 인덱스 통계를 만들 것입니다, 여전히 NULL 공간입니다. 분할하는 경향이 인덱스의 성능에 영향을 미칠에서 NULL 값이 NULL이 아닌 업데이트로 업데이트되어 현장에서 수행 할 수 없습니다. 대신 의미있는 값의 NULL 값은 SQL 문이 포함 된 피할 수 is not null결정.


3. 텍스트 유형의 최적화

텍스트 필드에 많은 양의 데이터를 저장하기 때문에, 테이블 용량은 메시지의 다른 필드의 성능에 영향을 미치는, 일찍 갈 것입니다. 우리는 관련 자연 키, 자식 테이블에 쉬었 것이 좋습니다.


4. 인덱스 튜닝

1) 분류 색인

  1. 일반 인덱스 : 기본 인덱스입니다.

  2. 지수 : 복수의 필드를 인덱싱 복합는 검색 질의를 촉진 할 수있다.

  3. 유일한 인덱스 : 일반 인덱스와 비슷하지만 인덱스 컬럼의 값이 고유해야합니다, 널 (null)이 있습니다.

  4. 고유 인덱스의 조합 : 열 값의 조합은 고유해야합니다.

  5. 기본 키 지수 : 특별한 고유 인덱스, 테이블의 고유 식별 데이터에 대한 기록은 일반적으로 기본 키 제약 조건, 널 (null)을 허용.

  6. 전체 텍스트 색인 : MySQL5.6 지원 전체 텍스트 인덱싱 후 질량 텍스트 쿼리, 이노와의 MyISAM합니다. 쿼리 정밀도 및 확장 성 가난 때문에 많은 기업들이 Elasticsearch을 선택합니다.

2) 인덱스 튜닝

  1. 쿼리 데이터의 양이 30 %를 초과하는 경우 쿼리를 페이징하는 것은 매우 중요하다, MySQL은 인덱스를 사용하지 않습니다.

  2. 단일 테이블 인덱스 번호가 아닙니다 5 개 이상, 더 이상 다섯 가지 이상의 단일 인덱스 필드 번호.

  3. 문자열 접두어 지수는 제어 문자 5-8의 접두사 길이를 사용할 수있다.

  4. 유일한 필드가 너무 낮은, 같은 이해가되지 않습니다 인덱스를 증가 : 성별을 제거할지 여부.

피복 률의 합리적인 사용은 다음과 같은 :

select login_name, nick_name from member where login_name = ?
login_name, nick_name两个字段建立组合索引,比login_name简单索引要更快


5. SQL 최적화

1) 일괄

블로거 부동 파편 모든 종류의가 물, 자식 연못 드레인에 작은 구멍을 파고 참조하십시오. 말과 잎은 항상 출구를 통과 할 수 있으며, 분기를 통해 다른 개체를 차단하고, 때로는, 수동 청소의 필요성을 박히.

MySQL은 물고기 연못이며, 동시에 네트워크 대역폭의 최대 수는 콘센트, SQL이 떠있는 사용자입니다. 페이징 매개 변수 또는 데이터 업데이트 및 삭제 작업의 많은 양의 영향 쿼리는 모든 가지, 우리가 일괄 처리를 중단 할 예 :

사업 내용 : 업데이트 사용자 모두 만료 된 쿠폰을 사용할 수 없습니다.

SQL 문 :

update status=0 FROM `coupon` WHERE expire_date <= #{currentDate} and status=1;

쿠폰을 다수 사용할 수없는 상태를 업데이트 할 필요가있는 경우, 다음과 같은 의사 코드의 배치 공정은 상기 SQL 다른 SQL 차단 될 수 실행 :

int pageNo = 1;
int PAGE_SIZE = 100;
while(true) {
    List<Integer> batchIdList = queryList('select id FROM `coupon` WHERE expire_date <= #{currentDate} and status = 1 limit #{(pageNo-1) * PAGE_SIZE},#{PAGE_SIZE}');
    if (CollectionUtils.isEmpty(batchIdList)) {
        return;
    }
    update('update status = 0 FROM `coupon` where status = 1 and id in #{batchIdList}')
    pageNo ++;
}

2) 운영 <> 최적화

일반적으로 <> 연산자는 다음과 같이 쿼리 $ 100 주문의 양이 아닌 예를 들어 인덱스를 사용할 수 없습니다 :

select id from orders where amount != 100;

양이 데이터 이러한 상황의 희귀, 심각한 불균등 분배를위한 100 명령에 따라 경우, 인덱스를 사용하는 것이 가능하다. 이러한 불확실성을 감안할 때, 중합 조합을 사용하여 검색 결과는 다시는 다음과 같습니다 :

(select id from orders where amount > 100) union all(select id from orders where amount < 100 and amount > 0)


3) 또는 최적화

이노 디비 엔진에서 나 같은 복합 인덱스를 사용할 수 없습니다 :

select id,product_name from orders where mobile_no = '13421800407' or user_id = 100;

Mobile_no + USER_ID 공격 또는 인덱스의 조합하지, 다음과 같이 연합 (EU), 고용 :

(select id,product_name from orders where mobile_no = '13421800407') union(select id,product_name from orders where user_id = 100);
此时id和product_name字段都有索引,查询才最高效。


4) IN 최적화

작은 아이 테이블에 대한 큰 메인 테이블에, 큰 아이 테이블에 대한 기본 테이블 존재한다. 쿼리 최적화 프로그램이 점점 더 커지고 있기 때문에, 많은 장면 모두 성능이 거의 같은 일.

예를 들어, 다음과 같이 쿼리를 조인 대신보십시오 :

select id from orders where user_id in (select id from user where level = 'VIP');

아래와 같이 조인을 사용 :

select o.id from orders o left join user u on o.user_id = u.id where u.level = 'VIP';

5) 열 동작을하지

다음 열 연산을 통해 질의 조건, 장애 지수 초래할 것이다 :

쿼리 일 주문

select id from order where date_format(create_time,'%Y-%m-%d') = '2019-07-01';

DATE_FORMAT 함수는 쿼리 재 작성 후 인덱스를 사용할 수 없습니다 원인 :

select id from order where create_time between '2019-07-01 00:00:00' and '2019-07-01 23:59:59';

6) 피가 모두 선택

당신이 사용을 방지하기 위해, 테이블의 모든 열을 쿼리하지 않는 경우 SELECT *, 효과적으로 인덱스를 사용할 수 없습니다, 전체 테이블 스캔 될 것입니다.


7)처럼 최적화

퍼지 쿼리처럼 (예를 들어, 필드 색인) :

SELECT column FROM table WHERE field like '%keyword%';

이 쿼리는 인덱스를 벗어났습니다 다음과 같은 문구로 교체 :

SELECT column FROM table WHERE field like 'keyword%';

이전 쿼리 % 외에 인덱스를 공격하지만, 제품 관리자는 이전과 이후에 퍼지 일치해야합니다? 전체 텍스트 인덱싱 전체 텍스트 시도 할 수 있지만, Elasticsearch 궁극적 인 무기입니다.


8) 최적화를 가입

결과는 기본 데이터 테이블로서 구동에 의해 설정되고, 필터 조건 테이블 쿼리 데이터주기와 다음의 노드를 통해 데이터를, 그 결과를 결합하여 중첩 루프를 사용하는 알고리즘을 조인 달성 가입. 여러 조인 경우 결과 앞에 재 질의 후의 환상 데이터를 데이터 테이블로서 설정된다.

  1. 를 ON 조건을 충족하는 적은 경우, 작은 결과 집합으로 큰 결과 세트를 이끌 수있는 테이블 구동 테이블과 구동 증가 쿼리.

  2. 색인 및 드라이브 테이블에 필드에 가입되어, 시간, 인덱스 적절한 가입 버퍼 크기의 제공 할 수 없습니다.

  3. 세 개의 테이블보다 연결 더 많은 참여 금지, 중복 필드를 증가하려고합니다.


9) 제한 최적화

페이징 제한에 대한 쿼리가 다음에 더 나쁜 성능을 켜면, 원리 솔루션 : 스캔 영역을 줄 다음과 같이 :

select * from orders order by id desc limit 100000,10 耗时0.4秒select * from orders order by id desc limit 1000000,10耗时5.2秒

먼저 다음과 같이 ID는 말로, 검색 범위를 좁힐 상영 :

select * from orders where id > (select id from orders order by id desc  limit 1000000, 1) order by id desc limit 0,10耗时0.5秒

쿼리 조건 경우에만 마스터 키 ID, 다음과 같은 말로 :

select id from orders where id between 1000000 and 1000010 order by id desc耗时0.3秒

위의 프로그램은 매우 느린 여전히 경우? 나는 커서를 사용했고, 관심 친구 JDBC 커서가 쿼리를 페이징 구현 사용 읽기

https://www.cnblogs.com/firstdream/p/7732656.html


03

다른 데이터베이스

백엔드 개발자, 저장 코어로 MySQL 또는 SQL Server의 확인 실력뿐만 아니라되는 NoSQL 데이터베이스에 적극적인 관심이 될, 그들은 성숙 널리 특정 시나리오에서 성능 병목 현상을 해결하기 위해 충분히 사용된다.

분류 데이터베이스 재산
키 유형 Memcache를 데이터의 컨텐츠 캐싱,로드가 많은 양의
키 유형 레디 스 콘텐츠 캐싱의 경우, 지원 더 Memcache의 데이터 유형에 비해, 그리고 영구 데이터 일 수있다
칼럼 저장 HBase를 하둡 코어 데이터베이스 시스템, 대규모 구조화 된 데이터 스토리지, 필요한 빅 데이터.
문서 유형 MongoDB를 잘 알려진 문서 데이터베이스는 캐시로 사용할 수 있습니다
문서 유형 CouchDB를 REST API에 대한 아파치 오픈 소스 프로젝트, 사용의 용이성에 초점을 맞춘 지원
문서 유형 SequoiaDB 잘 알려진 문서 데이터베이스
그래프 Neo4J 빌드 관계, 추천 시스템에 소셜 네트워킹을위한지도
-END-
推荐阅读:
算法题从入门到放弃?刷了几千道算法题,关于如何刷题有些话我想对你说

刷了几千道算法题,这些我私藏的刷题网站都在这里了!

奥利给!有了这么豪横的指南,还愁不会逛 GitHub?!

速观!GitHub 总星 5.4w+,这里藏着 Git 从入门到轻松玩转的秘密!

B站收藏 6.1w+!GitHub 标星 3.9k+!这门神课拯救了我薄弱的计算机基础


????扫描上方二维码即可关注
게시 된 613 개 원래 기사 · 원 찬양 7657 · 조회수 1,330,000 +

추천

출처blog.csdn.net/u013486414/article/details/105020876