MySQL 이 전체 표 스 캔 을 하 는 몇 가지 상황 을 초래 합 니 다.
상황 1:
강제 형식 변환 의 경우 색인 을 사용 하지 않 고 전체 표 로 스 캔 합 니 다.
예 를 들 면 다음 과 같다.
우선 시 계 를 만 들 겠 습 니 다.
CREATE TABLE `test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`age` int(11) DEFAULT NULL,
`score` varchar(20) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
KEY `idx_score` (`score`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8
우 리 는 이 표 에 세 개의 필드 가 있 는데,그 중 두 개의 int 유형,한 개의 varchar 유형 이 있다 는 것 을 볼 수 있다.varchar 형식의 필드 score 는 색인 이 고 id 는 메 인 키 입 니 다.그 다음 에 우 리 는 이 표 에 데 이 터 를 삽입 하고 데 이 터 를 삽입 한 후의 표 는 다음 과 같다.
mysql:yeyztest 21:43:12>>select * from test;
+----+------+-------+
| id | age | score |
+----+------+-------+
| 1 | 1 | 5 |
| 2 | 2 | 10 |
| 5 | 5 | 25 |
| 8 | 8 | 40 |
| 9 | 2 | 45 |
| 10 | 5 | 50 |
| 11 | 8 | 55 |
+----+------+-------+
7 rows in set (0.00 sec)
이때,우 리 는 explain 문 구 를 사용 하여 두 sql 의 실행 상황 을 살 펴 보 았 습 니 다.각각:
explain select * from test where score ='10';
explain select * from test where score =10;
결 과 는 다음 과 같다.
mysql:yeyztest 21:42:29>>explain select * from test where score ='10';
+----+-------------+-------+------------+------+---------------+-----------+---------+-------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+-----------+---------+-------+------+----------+-------+
| 1 | SIMPLE | test | NULL | ref | idx_score | idx_score | 62 | const | 1 | 100.00 | NULL |
+----+-------------+-------+------------+------+---------------+-----------+---------+-------+------+----------+-------+
1 row in set, 1 warning (0.00 sec)
mysql:yeyztest 21:43:06>>explain select * from test where score =10;
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
| 1 | SIMPLE | test | NULL | ALL | idx_score | NULL | NULL | NULL | 7 | 14.29 | Using where |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
1 row in set, 3 warnings (0.00 sec)
이 를 통 해 알 수 있 듯 이 우리 가 varchar 형식의 값 을 사용한다 면 결과 에서 스 캔 한 줄 수 rows 는 1 이 고 전체 수치 10 을 사용 할 때 스 캔 줄 수 는 7 로 바 뀌 어 강제 형식 전환 이 발생 하면 색인 이 실 효 될 수 있 음 을 증명 합 니 다.상황 2:
역방향 조 회 는 색인 을 사용 할 수 없 으 며,전체 표 스 캔 을 초래 할 수 있 습 니 다.
표 test 1 을 만 듭 니 다.메 인 키 는 score 이 고 6 개의 데 이 터 를 삽입 합 니 다.
CREATE TABLE `test1` (
`score` varchar(20) not null default '' ,
PRIMARY KEY (`score`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
mysql:yeyztest 22:09:37>>select * from test1;
+-------+
| score |
+-------+
| 111 |
| 222 |
| 333 |
| 444 |
| 555 |
| 666 |
+-------+
6 rows in set (0.00 sec)
역방향 검색 을 사용 할 때 색인 을 사용 하지 않 습 니 다.다음 두 개의 sql 을 보십시오.
explain select * from test1 where score='111';
explain select * from test1 where score!='111';
mysql:yeyztest 22:13:01>>explain select * from test1 where score='111';
+----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------------+
| 1 | SIMPLE | test1 | NULL | const | PRIMARY | PRIMARY | 62 | const | 1 | 100.00 | Using index |
+----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------------+
1 row in set, 1 warning (0.00 sec)
mysql:yeyztest 22:13:08>>explain select * from test1 where score!='111';
+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+--------------------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+--------------------------+
| 1 | SIMPLE | test1 | NULL | index | PRIMARY | PRIMARY | 62 | NULL | 6 | 100.00 | Using where; Using index |
+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+--------------------------+
1 row in set, 1 warning (0.00 sec)
볼 수 있다,사용!=조건 으로 스 캔 한 줄 수 는 표 의 총 기록 줄 수 입 니 다.따라서 색인 을 사용 하려 면 역방향 일치 규칙 을 사용 할 수 없습니다.상황 3:
일부 or 값 조건 은 전체 표 스 캔 을 초래 할 수 있 습 니 다.
먼저 우 리 는 표를 만 들 고 몇 개의 데 이 터 를 삽입 합 니 다.
CREATE TABLE `test4` (
`id` int(11) DEFAULT NULL,
`name` varchar(20) DEFAULT NULL,
KEY `idx_id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
[email protected]:yeyztest 22:23:44>>select * from test4;
+------+------+
| id | name |
+------+------+
| 1 | aaa |
| 2 | bbb |
| 3 | ccc |
| 4 | yeyz |
| NULL | yeyz |
+------+------+
5 rows in set (0.00 sec)
그 중에서 표 test 4 는 두 개의 필드 를 포함 하고 id 필드 는 하나의 색인 이 며 name 필드 는 varchar 형식 입 니 다.다음 세 문장의 스 캔 줄 수 를 살 펴 보 겠 습 니 다.
explain select * from test4 where id=1;
explain select * from test4 where id is null;
explain select * from test4 where id=1 or id is null;
mysql:yeyztest 22:24:12>>explain select * from test4 where id is null;
+----+-------------+-------+------------+------+---------------+--------+---------+-------+------+----------+-----------------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+--------+---------+-------+------+----------+-----------------------+
| 1 | SIMPLE | test4 | NULL | ref | idx_id | idx_id | 5 | const | 1 | 100.00 | Using index condition |
+----+-------------+-------+------------+------+---------------+--------+---------+-------+------+----------+-----------------------+
1 row in set, 1 warning (0.00 sec)
mysql:yeyztest 22:24:17>>explain select * from test4 where id=1;
+----+-------------+-------+------------+------+---------------+--------+---------+-------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+--------+---------+-------+------+----------+-------+
| 1 | SIMPLE | test4 | NULL | ref | idx_id | idx_id | 5 | const | 1 | 100.00 | NULL |
+----+-------------+-------+------------+------+---------------+--------+---------+-------+------+----------+-------+
1 row in set, 1 warning (0.00 sec)
mysql:yeyztest 22:24:28>>explain select * from test4 where id=1 or id is null;
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
| 1 | SIMPLE | test4 | NULL | ALL | idx_id | NULL | NULL | NULL | 5 | 40.00 | Using where |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
1 row in set, 1 warning (0.00 sec)
id=1 과 id is null 을 단독으로 사용 하 는 것 을 볼 수 있 습 니 다.모두 한 줄 의 기록 만 스 캔 하고 or 를 사용 하여 두 사람 을 연결 하면 색인 을 사용 하지 않 고 전체 표를 스 캔 할 수 있 습 니 다.간단하게 요약 하면:
1.형식 변환 을 강제 할 경우 색인 을 사용 하지 않 고 전체 표 로 스 캔 합 니 다.
2.역방향 조 회 는 색인 을 사용 할 수 없고 전체 표 스 캔 을 초래 할 수 있 습 니 다.
3.일부 or 값 조건 은 전체 표 스 캔 을 초래 할 수 있 습 니 다.
이상 은 MySQL 이 전체 표 스 캔 을 하 게 된 몇 가지 상황 에 대한 상세 한 내용 입 니 다.MySQL 전체 표 스 캔 에 관 한 자 료 는 저희 의 다른 관련 글 을 주목 하 세 요!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Redash를 사용할 때 몰랐던 SQL을 쓰는 법을 배웠습니다.최근 redash에서 sql을 쓸 기회가 많고, 이런 쓰는 방법이 있었는지와 sql에 대해 공부를 다시하고 있기 때문에 배운 것을 여기에 씁니다. Redash란? 월별로 데이터를 표시하고 싶습니다 주별로 데이터를 표...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.