MySQL 이 전체 표 스 캔 을 하 는 몇 가지 상황 을 초래 합 니 다.

9280 단어 MySQL시계스캐닝
이틀 동안 전체 시 계 를 스 캔 할 수 있 는 sql 두 가 지 를 보 았 습 니 다.여기 서 보 여 드 리 겠 습 니 다.구덩이 밟 는 것 을 피 할 수 있 기 를 바 랍 니 다.
상황 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 전체 표 스 캔 에 관 한 자 료 는 저희 의 다른 관련 글 을 주목 하 세 요!

좋은 웹페이지 즐겨찾기