MySQL 데이터베이스에 대 한 SQL 문의 일반적인 최적화 방법
1. 쿼리를 최적화 하려면 전체 테이블 스캔을 피하기 위해, 먼저 where와 열에 의해 인덱스의 설립에 참여 하려고 한다 당신이.
2. WHERE 절까지 가능한, 또는 그것은 피해 야 한다에서 필드의 null 값 엔진 같은 전체 테이블 스캔에 대 한 인덱스를 사용 하 여 삭제 하면:
Num은 null t에서 ID를 선택
테이블의 숫자 열 않습니다 없습니다 null 값 하 고이 이렇게 다음 쿼리는 NUM에 0의 기본 값을 설정할 수 있습니다.
T에서 ID를 선택 어디 num = 0
3. 사용! = 또는 WHERE 절에 <> 연산자는 가능한 피해 야 한다, 그렇지 않으면 엔진 전체 테이블 스캔에 대 한 인덱스를 사용 하 여 삭제.
4. 사용 하지 않도록 하거나 엔진 같은 전체 테이블 스캔에 대 한 인덱스를 사용 하 여 삭제 하면 WHERE 절의 조건에 가입 하려고 한다:
T에서 ID를 선택 어디 num = 10 또는 num = 20
이렇게이 하면을 쿼리할 수 있습니다.
T에서 ID를 선택 어디 num = 10
모든 조합
T에서 ID를 선택 어디 num = 20
5.에 고에 또한 주의 그렇지 않으면 그것 같은 전체 테이블 스캔 발생 합니다 사용 해야 합니다.
T에서 ID를 선택 어디 num (1,2,3)
연속 값에 대 한 사용 사이 대신에:
T에서 ID를 선택 어디 1와 3 사이 num
6. 다음 쿼리도 전체 테이블 스캔 발생 합니다.
어디 'abc %'와 같은 이름에서 ID를 선택
효율성을 높이기 위해 전체 텍스트 검색을 고려할 수 있습니다.
7. 전체 테이블 스캔에서 또한 결과 WHERE 절에 매개 변수를 사용 하 여. SQL만 실행 시 로컬 변수를 해결, 때문에 최적화 프로그램 런타임; 액세스 계획의 선택 연기할 수 없습니다. 그러나, 액세스 계획을 컴파일 타임에 설정 하는 경우 변수의 값은 알 수 없는 그리고 인덱스에 대 한 항목으로 선택할 수 없습니다. 다음 문을 전체 테이블 스캔을 수행 합니다.
T에서 ID를 선택 어디 num = @num
쿼리 하는 대신 인덱스를 사용할 수 있습니다.
ID에서에서 선택 T (인덱스 이름) 어디 num = @num
8. 당신은 엔진 전체 테이블 스캔에 대 한 인덱스를 사용 하 여 삭제 하도록 하면 WHERE 절에는 필드의 식을 피하기 위해 시도해 야 한다. 로:
어디 num/2 = 100 t에서 ID를 선택
읽어야 한다:
T에서 ID를 선택 어디 num = 100 * 2
9. 엔진 전체 테이블 스캔에 대 한 인덱스를 사용 하 여 삭제 하도록 하면 WHERE 절에서 필드의 기능 작업을 하지 마십시오. 로:
T에서 ID를 선택 어디 하위 문자열 (이름, 1, 3) = ' abc '-ABC로 시작 하는 ID를 이름
T에서 선택 ID에 의해 생성 된 ID 어디 DATEDIFF (일 createdate, ' 2005-11-30 ') = 0-' 2005-11-30 '
읽어야 한다:
어디 'abc %'와 같은 이름에서 ID를 선택
T에서 ID를 선택 어디 createdate > = ' 2005-11-30 '과 createdate < ' 2005-12-1 '
10. 수행 하지 않고 함수, 산술 연산, 또는 WHERE 절에 "="의 왼쪽에 다른 식 작업 또는 시스템 인덱스를 올바르게 사용 하지 않을 수 있습니다.
11. 때를 사용 하 여 인덱싱된 필드를 조건으로, 복합 인덱스는 인덱스의 경우 인덱스 시스템에 의해 사용 됩니다, 그렇지 않으면 인덱스는 사용 되지 것입니다, 그리고 필드의 순서는 가능한 인덱스 순서와 일치 해야 되도록 인덱스에서 첫 번째 필드 조건으로 사용 해야 합니다.
12. 쓰지 일부 의미 없는 쿼리, 빈 테이블 구조를 생성 하는 필요:
여기서 1 c o l 1, #t에 c o l 2를 선택 = 0
코드의이 유형은 모든 결과 집합을 반환 하지 않습니다 하지만 시스템 리소스를 소모 하 고이 이렇게 변경 해야 합니다.
테이블 #t (...)
13.에 대신 존재 하는 사용 하는 좋은 선택 이다.
Where에서 num을 선택 (선택 num B에서)에서 num
다음 문을 바꿉니다.
Where 존재에서 num을 선택 (b에서 1을 선택 어디 num=a.num)
14. 모든 인덱스는 쿼리, SQL 쿼리를 기반으로 테이블 데이터에 대 한 최적화 및 SQL 쿼리 수 있습니다 활용 하지 인덱스 있을 때 많은 양의 데이터 중복 인덱스 열의 테이블 필드 섹스, 남성, 여성 등 거의 절반, 섹스에도 인덱싱 쿼리 효율성에 대 한 작동 하지 않습니다.
15. 인덱스는 아닙니다 더 나은, 하지만 인덱스 해당 선택의 효율성을 높일 수 있지만 삽입 또는 업데이트 인덱스를 다시 작성 가능성이 있기 때문에 또한 삽입 및 업데이트의 효율성을 줄일 수, 그래서 인덱스를 작성 하는 방법 상황에 따라 심사 필요. 그것은 한 테이블에 6 개 이상의 인덱스를 하지 않는 가장 자주 사용 되는 열을 기반으로 하는 인덱스에 대 한 필요성을 고려해 야 합니다 너무 많은 경우.
16. 피하 가능한 만큼 클러스터 된 인덱싱된 데이터 열을 업데이트 클러스터 된 인덱싱된 데이터 열 순서는 열 값의 변경 사항을 전체 테이블 레코드 순서 경우 비싼 될 수 있는 테이블 레코드의 실제 저장소 순서 때문에. 응용 프로그램 시스템 클러스터 된 인덱싱된 데이터 열의 잦은 업데이 트를 필요한 경우 인덱스 클러스터 된 인덱스로 건설 되어야 합니다 여부를 하는 것이 좋습니다.
17.를 사용 하 여 숫자 필드 가능한 만큼, 경우에 숫자 정보가 포함 된 필드 문자 형식으로 설계 되지 않았습니다,이 쿼리 및 연결 성능이 저하 되며 저장소 오버 헤드가 증가. 이 때문에 엔진 쿼리 및 연결을 처리 하는 동안 한 번에 한 문자열의 각 문자를 비교 하 고 그것은 한 번에 비교할 수 숫자 형식에 대 한 충분 하다.
18. Varchar/가능한 대신 Char/nchar, nvarchar 첫 번째 변수 긴 필드 저장 공간이 작습니다, 있기 때문에 저장할 수 있습니다 저장 공간, 두 번째 쿼리에 대 한, 상대적으로 작은 분야 검색 효율은 분명 더 높은.
19. 사용 하지 마십시오 선택 * t 어디에서 대신 특정 필드 목록을 사용 하 여 "*", 그리고 사용 되지 않는 모든 필드를 반환 하지 않습니다.
20. 임시 테이블 대신 가능한 테이블 변수를 사용 합니다. 테이블 변수에 많은 양의 데이터를 포함 하는 경우 인덱스는 매우 제한 (만 기본 키 인덱스).
21. 자주 생성 및 시스템 테이블 자원의 소비를 줄이기 위해 임시 테이블을 삭제 하지 마십시오.
22. 임시 테이블은 사용할 수 없게 하 고 보다 효율적으로 몇 가지 루틴, 예를 들어 반복적으로 큰 테이블 또는 공통 테이블에서 데이터 집합을 참조 해야 하는 경우에 적절 하 게 사용할 수 있습니다. 그러나, 일회성 이벤트에 대 한 내보내기 테이블을 사용 하 여 최상 이다.
23. 만들 때 새 임시 테이블을 한 번에 삽입 되는 데이터의 양을 크면, 선택에 사용할 수 있습니다 만들기 테이블 대신 로그 데이터는 시스템 테이블의 리소스를 줄이기 위해 작은 속도, 향상의 많은 수를 초래 하지 않도록 만들어야 테이블 먼저, 그리고 삽입.
24. 임시 테이블을 사용 하는 경우 저장된 프로시저의 끝에 모든 임시 테이블을 명시적으로 삭제, 처음 테이블을 자릅니다 및 다음 시스템 테이블의 더 이상 잠금 방지 테이블을 삭제 해야 합니다.
25. 커서의 효율성은 가난 하 고, 다음 다시 쓰기 고려 한다 10000 개 이상의 행의 데이터를 커서 작업 때문에 커서의 사용을 피하십시오.
26. 커서 또는 임시 테이블 방법에 따라 메서드를 사용 하기 전에 먼저 문제를 해결 하기 위해 집합된 기반된 솔루션에 대 한 보여야 하 고 설정된 기반된 접근 방식을 일반적으로 더 효율적입니다.
27.으로 임시 테이블, 커서는 사용할 수 없습니다. Fast_forward 커서를 사용 하 여 작은 데이터 집합에 대 한 필요한 데이터를 여러 테이블을 참조 해야 하는 경우에 특히 일반적으로 다른 행으로 라인 방법 보다 더입니다. 결과 집합에 요약을 포함 하는 루틴 일반적으로 더 커서와 함께 사용 되는. 개발 시간이 허용 하는 경우 커서 기반 접근 및 집합 기반으로 접근 하려고 수 있습니다 어떤 방법을 더 나은 작품 참조.
28. 모든 저장된 프로시저와 트리거의 처음에 set NOCOUNT 설정 하 고 끝에 NOCOUNT 설정. 저장된 프로시저와 트리거의 각 문을 실행 한 후 클라이언트에 게 DONE_IN_PROC 메시지를 보낼 필요가 없습니다.
29. 큰 비즈니스 운영을 피하기 위해, 시스템 동시성 기능을 개선 하려고 합니다.
30. 클라이언트에 대용량 데이터의 반환을 방지 하려고, 데이터의 양이 너무 큰 경우에, 우리는 해당 수요 합리적인 인지 고려해 야 한다.