내 연락처 정보
우편메소피아@프로톤메일.com
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
SQL 언어는 데이터 쿼리 언어 DQL, 데이터 조작 언어 DML, 데이터 정의 언어 DDL, 데이터 제어 언어 DCL의 네 가지 범주로 나뉩니다.
1. 데이터 쿼리 언어 DQL
데이터 쿼리 언어 DQL의 기본 구조는 SELECT 절, FROM 절, WHERE 절로 구성된 쿼리 블록입니다. SELECT <필드명 테이블> FROM <테이블 또는 뷰 이름> WHERE <쿼리 조건>
2. 데이터 조작 언어 DML
데이터 조작 언어 DML에는 세 가지 주요 형태가 있습니다.
1) 삽입: 삽입
2) 업데이트: 업데이트
3) 삭제: 삭제
3. 데이터 정의 언어 DDL
데이터 정의 언어 DDL은 데이터베이스 ----- 테이블, 뷰, 인덱스, 동의어, 클러스터 등의 다양한 개체를 생성하는 데 사용됩니다. CREATE TABLE / VIEW / INDEX / SYN / CLUSTER 테이블 뷰 인덱스 동의어 클러스터 | . DDL 작업은 암시적으로 제출됩니다! 롤백할 수 없습니다.
4. 데이터 제어 언어 DCL
데이터 제어 언어 DCL은 데이터베이스에 액세스하기 위한 특정 권한을 부여하거나 취소하고, 데이터베이스 조작 트랜잭션의 시간과 효과를 제어하고, 데이터베이스를 모니터링하는 데 사용됩니다. 좋다:
1) GRANT: 승인.
2) ROLLBACK [WORK] TO [SAVEPOINT] : 특정 지점으로 롤백합니다. Rollback---ROLLBACK 롤백 명령은 데이터베이스 상태를 마지막으로 제출된 상태로 되돌립니다. 형식은 다음과 같습니다: SQL>ROLLBACK;
3) COMMIT [작업]: 제출합니다. 데이터베이스 삽입, 삭제 및 수정 작업 중에 트랜잭션은 데이터베이스에 제출될 때만 완료됩니다. 트랜잭션이 커밋되기 전에는 데이터베이스를 운영하는 사람만이 수행된 작업을 볼 수 있는 권한이 있습니다. 다른 사람은 최종 커밋이 완료된 후에만 볼 수 있습니다.
데이터베이스 인증 명령:
사용자에게 테이블 이름(또는 열 이름)에 대한 GRANT<permission>
정답 옵션 B: 삽입, 선택: 권한 테이블 이름: 사용자 사용자: nkw
보충 지식 포인트 - 재활용 권한
FROM 사용자의 테이블 이름(또는 열 이름)에 대한 REVOKE <permission>
실행 계획을 보기 위한 명령문으로 사용되는 explain 명령문은 다들 잘 아실 거라 믿습니다. explain은 SQL 최적화 분석에 자주 사용됩니다.
여기서는 주목할 가치가 있습니다. explain은 실제로 명령문을 실행하지 않고 실행 계획만 표시합니다.
어떤 정보를 볼 수 있나요?
- EXPLAIN SELECT select具体语句
- 如:
- EXPLAIN SELECT * FROM userpro
목록 | 설명하다 | 다시 채우다 |
ID | 각 SELECT 키워드는 ID에 해당합니다. | |
선택_유형 | SELECT 키워드에 해당하는 쿼리 유형 | |
테이블 | 테이블 이름 | |
파티션 | 일치하는 파티션 정보 | |
유형 | 단일 테이블에 대한 액세스 방법 | |
가능한 키 | 가능한 인덱스 | |
열쇠 | 실제 사용된 인덱스 | |
키_길이 | 사용된 실제 인덱스 길이 | |
참조 | 인덱스 열 동등 쿼리 사용 시, 동등성을 위한 인덱스 열과 일치하는 개체 정보입니다. | |
행 | 읽을 예상 레코드 수 | |
거르는 | 검색 기준으로 필터링한 후 남은 기록의 비율 |
|
추가의 | 추가 정보 |
1,아이디
각 SELECT 키워드는 ID에 해당합니다.
id 값이 클수록 우선순위가 높아 먼저 실행됩니다.
ID가 동일할 경우 하나의 그룹으로 간주하여 위에서 아래로 순차적으로 실행될 수 있습니다.
각 ID 번호는 독립적인 쿼리를 나타냅니다. SQL 문의 쿼리 수가 적을수록 좋습니다.
2,선택_유형
범주 | 설명하다 |
단순한 | 단일 테이블 쿼리, 하위 쿼리 또는 UNION 쿼리 없음. |
주요한 | 쿼리의 가장 바깥쪽 SELECT 문입니다. |
하위 쿼리 | WHERE 절에는 하위 쿼리가 사용됩니다. |
파생된 | FROM 절에 포함된 하위 쿼리의 경우 MySQL은 이를 DERIVED(파생)로 표시하고 외부 쿼리에서 사용할 결과 집합에 대한 임시 테이블을 생성합니다. |
노동 조합 | UNION 쿼리의 두 번째 및 후속 쿼리 문입니다. |
노동조합 결과 | UNION 쿼리의 결과 집합입니다. |
종속 하위 쿼리 | 하위 쿼리의 결과는 외부 쿼리의 값에 따라 달라지며 하위 쿼리는 외부 쿼리의 각 행에 대해 한 번씩 실행됩니다. |
종속 노동 조합 | UNION 쿼리의 두 번째 및 후속 쿼리 문과 결과는 외부 쿼리의 값에 따라 달라집니다. |
캐시할 수 없는 하위 쿼리 | 하위 쿼리는 캐시할 수 없으며 참조될 때마다 실행됩니다. |
3. 테이블 열은 테이블의 테이블 이름을 나타냅니다(때때로 실제 테이블 이름이 아닐 수도 있고 약어일 수도 있음).
4. 파티션(선택사항)
5. 타입☆
일반적인 유형은 다음과 같습니다
유형 | 설명하다 |
체계 | 일반적으로 테이블에는 행이 하나만 있습니다. SELECT ... FROM DUAL 쿼리 최적화. |
구성하다 | 쿼리는 인덱스를 통해 한 번만 발견되며 결과 행은 하나만 있습니다(상수 테이블). |
등호 참조 | 다른 테이블에서 행을 찾으려면 고유 인덱스나 기본 키를 사용하세요. |
참조 | 다른 테이블에서 하나 이상의 행을 찾으려면 고유하지 않은 인덱스를 사용하십시오. |
범위 | 인덱스를 사용하여 행 범위를 반환합니다. |
색인 | 전체 테이블을 스캔하는 대신 인덱스를 완전히 스캔하여 행을 찾습니다. |
모두 | 전체 테이블 스캔은 테이블의 모든 행을 검사합니다. |
일반적으로 모든 것을 피하려고 노력하십시오.
6, 키와 가능한_키
열쇠:
key
필드에는 쿼리에서 사용되는 실제 인덱스가 표시됩니다.이 필드의 값이 다음과 같은 경우NULL
, 인덱스가 사용되지 않음을 나타냅니다. 이 필드에 값이 있으면 MySQL이 지정된 인덱스를 사용하여 쿼리를 실행했음을 의미합니다.가능한 키:
possible_keys
필드에는 MySQL이 사용할 수 있는 인덱스 목록이 표시됩니다. 이러한 인덱스는 쿼리에서 고려될 수 있지만 실제로 사용되지는 않는 인덱스입니다. 대개,possible_keys
에 나열된 인덱스는 쿼리 조건 및 테이블 구조에 따라 결정됩니다.만약에 key
필드에는 인덱스 이름이 있으며possible_keys
여러 인덱스 이름이 에 나열되어 있으며 이는 MySQL이 선택했음을 나타냅니다.key
필드가 나열된 인덱스는 쿼리를 수행하는 데 사용되고 다른 인덱스는 쿼리를 수행하는 데 사용됩니다.possible_keys
Medium은 또한 고려될 수 있지만 궁극적으로 사용되지는 않는다고 말했습니다.
만약에 key
필드는 다음과 같습니다.NULL
,그리고 possible_keys
여러 인덱스 이름이 에 나열되어 있는데, 이는 MySQL이 쿼리를 실행할 때 어떤 인덱스도 사용하지 않음을 나타내며, 이로 인해 전체 테이블 스캔이나 기타 인덱스가 아닌 최적화된 액세스 방법이 발생할 수 있습니다.
7,키_길이
key_len
인덱스 키의 길이를 설명하는 필드입니다. MySQL이 특정 인덱스를 사용하여 쿼리를 실행할 때 인덱스 사용량과 인덱스 키 길이를 나타냅니다.
단일 열 인덱스:
INT
),하지만 key_len
값은 열의 길이입니다.VARCHAR
),하지만 key_len
값은 필드의 최대 길이입니다.복합지수:
key_len
인덱스에 있는 모든 열의 전체 길이를 나타냅니다.결합지수:
key_len
결합된 인덱스에 있는 모든 열의 총 길이입니다.색인 접두어:
key_len
사용된 인덱스 부분의 실제 길이가 표시됩니다.8,참고문헌
ref
테이블 간의 연결 조건을 기술하거나, 고유하지 않은 인덱스를 이용하여 검색하는 필드입니다. 이는 쿼리를 실행할 때 MySQL이 테이블에 액세스하기 위해 사용하는 조인 조건이나 인덱스를 나타냅니다.
9,줄
rows
쿼리를 실행할 때 액세스하거나 검사한 행 수의 추정치입니다.
SELECT
문의,rows
반환할 예상 행 수를 나타냅니다.JOIN
) 또는 하위 쿼리,rows
조인 작업 중에 액세스된 행 수를 나타낼 수 있습니다.rows
스캔된 행 수를 나타낼 수 있습니다.10,필터링됨
WHERE 조건 및 인덱스 조건을 기준으로 필터링된 행의 비율을 나타냅니다. 필터링됨은 최적화 프로그램에서 추정한 쿼리 최적화 효과를 반영합니다.
언제 filtered
100%에 가까우면 쿼리 조건이 조건을 충족하지 않는 대부분의 행을 효과적으로 필터링했음을 의미하며 이는 일반적으로 좋은 최적화 지표입니다.
반대로 만약에 filtered
값이 낮으면 쿼리 조건이 충분히 정확하지 않거나 최적화 프로그램이 인덱스를 효과적으로 사용하여 데이터를 필터링하지 않음을 나타낼 수 있습니다.
11,추가
추가 정보 필드
다음은 몇 가지 일반적인 것입니다. Extra
필드와 그 의미:
인덱스 사용:
어디에서 사용:
임시 사용:
filesort 사용하기:
각 레코드에 대해 범위가 검사됨(인덱스 맵: ...):
range
쿼리 유형.NULL 키에 대한 전체 스캔:
별개의:
조인 버퍼 사용(블록 중첩 루프):
불가능한 곳:
테이블을 사용하지 않음:
SELECT NOW()
。- CREATE TABLE s1 (
- id INT AUTO_INCREMENT,
- key1 VARCHAR(100),
- key2 INT,
- key3 VARCHAR(100),
- key_part1 VARCHAR(100),
- key_part2 VARCHAR(100),
- key_part3 VARCHAR(100),
- common_field VARCHAR(100),
- PRIMARY KEY (id),
- INDEX idx_key1 (key1),
- UNIQUE INDEX idx_key2 (key2),
- INDEX idx_key3 (key3),
- INDEX idx_key_part(key_part1, key_part2, key_part3)
- ) ENGINE=INNODB CHARSET=utf8;
- CREATE TABLE s2 (
- id INT AUTO_INCREMENT,
- key1 VARCHAR(100),
- key2 INT,
- key3 VARCHAR(100),
- key_part1 VARCHAR(100),
- key_part2 VARCHAR(100),
- key_part3 VARCHAR(100),
- common_field VARCHAR(100),
- PRIMARY KEY (id),
- INDEX idx_key1 (key1),
- UNIQUE INDEX idx_key2 (key2),
- INDEX idx_key3 (key3),
- INDEX idx_key_part(key_part1, key_part2, key_part3)
- ) ENGINE=INNODB CHARSET=utf8;
데이터는 직접 준비합니다.
단일 테이블 쿼리
EXPLAIN SELECT * FROM `s1`;
조인 쿼리
EXPLAIN SELECT * FROM `s1` INNER JOIN `s2`;
하위 쿼리
- EXPLAIN SELECT * FROM s1 WHERE key1 IN (SELECT key2 FROM s2 WHERE common_field
- = 'a');
- #Union 去重
- EXPLAIN SELECT * FROM `s1` UNION SELECT * FROM `s2`;
- #Union 全查
- EXPLAIN SELECT * FROM `s1` UNION ALL SELECT * FROM `s2`;
마지막 단계는 중복 제거이므로 임시 테이블이 사용됩니다. 그러나 UNION ALL은 모두에 대한 쿼리이므로 임시 테이블 쿼리 메시지는 나타나지 않습니다.
const (인덱스를 한 번 찾으십시오. 결과는 한 행만 찾습니다)
EXPLAIN SELECT * FROM s1 WHERE id = 10002;
eq_ref(고유 인덱스 또는 기본 키를 사용하여 다른 테이블에서 행 찾기)
EXPLAIN SELECT * FROM s1 INNER JOIN s2 ON s1.id = s2.id;
ref(다른 테이블에서 하나 이상의 행을 찾으려면 고유하지 않은 인덱스를 사용)
EXPLAIN SELECT * FROM s1 WHERE key1 = 'a';
range(인덱스를 사용하여 행 범위를 반환)
EXPLAIN SELECT * FROM s1 WHERE key1 IN ('a', 'b', 'c');
인덱스(행을 찾기 위해 인덱스를 완전히 스캔함)
EXPLAIN SELECT key_part2 FROM s1 WHERE key_part3 = 'a';
필터링된 소수 시간
EXPLAIN SELECT * FROM s1 WHERE key1 > 'za' AND common_field = 'la'