MySQL은 if 함수 안에있을 때 인덱스를 사용할 수 없습니다 : MySQL에서는 불가능한 함수에 대한 인덱스가 필요합니다.
도 참조 :이 질문을 모방 그래서 직원 테스트 데이터베이스 http://dev.mysql.com/doc/employee/en/employee.html
mysql> describe employees;
+------------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+---------------+------+-----+---------+-------+
| emp_no | int(11) | NO | PRI | NULL | |
| birth_date | date | NO | | NULL | |
| first_name | varchar(14) | NO | | NULL | |
| last_name | varchar(16) | NO | | NULL | |
| gender | enum('M','F') | NO | | NULL | |
| hire_date | date | NO | | NULL | |
+------------+---------------+------+-----+---------+-------+
6 rows in set (0.01 sec)
mysql> select count(*) from employees;
+----------+
| count(*) |
+----------+
| 300024 |
+----------+
1 row in set (0.37 sec)
세트 남성에 대한 모든 성별을 사용하고 How does one create an index on the date part of DATETIME field in MySql
.
mysql> update employees set gender = 'M';
Query OK, 1 row affected (9.11 sec)
Rows matched: 300024 Changed: 1 Warnings: 0
mysql> select emp_no, gender from employees order by emp_no limit 2;
+--------+--------+
| emp_no | gender |
+--------+--------+
| 10001 | M |
| 10002 | M |
+--------+--------+
2 rows in set (0.00 sec)
직원 한 명을 여성으로 설정하십시오. (이 인덱스를 사용하고, 거의 즉시이다 확인할 수 있습니다.)
mysql> update employees set gender = 'F' where emp_no = 10001;
Query OK, 1 row affected (0.14 sec)
Rows matched: 1 Changed: 1 Warnings: 0
이제 우리는 제안 된 대답을 사용합니다. (인덱스를 사용하지 않고 모든 행에 주목합니다.)
mysql> update employees set gender = if(emp_no=10002, 'F', 'M');
Query OK, 2 rows affected (10.67 sec)
Rows matched: 300024 Changed: 2 Warnings: 0
인덱스가 도움이 될까요?
> mysql> create index employees_gender_idx on employees(gender);
Query OK, 300024 rows affected (21.61 sec)
Records: 300024 Duplicates: 0 Warnings: 0
> mysql> update employees set gender = if(emp_no=10001, 'F', 'M');
Query OK, 2 rows affected (9.02 sec)
Rows matched: 300024 Changed: 2 Warnings: 0
Nope.
MySQL은 변경해야 할 행만 살펴볼 것이라고합니다.
mysql> update employees set gender = 'M';
Query OK, 1 row affected (8.78 sec)
Rows matched: 300024 Changed: 1 Warnings: 0
맞춰보세요. WHERE
절을 사용하면 어떨까요?
mysql> update employees set gender = 'M' where gender ='F';
Query OK, 0 rows affected (0.03 sec)
Rows matched: 0 Changed: 0 Warnings: 0
빠른 속도로 색인이 사용되었습니다.
Mysql은 IF
함수가 무엇을 리턴하는지 알지 못하며 은이어야합니다. 전체 테이블 스캔을 수행하십시오. WHERE
은 실제로 어디에서 의미가 있으며 SET
은 실제로 의미가 있음을 나타냅니다.당신은 DB가 당신의 모든 조항을 좋은 성능을 얻기 위해 준비 할 것이라고 기대할 수는 없습니다.
올바른 해결책은 두 개의 업데이트 (사용 인덱스가 거의 인스턴트 될 것입니다 경우.)
통지서를 발급하는 것입니다, 그것은 MySQL이 마술 만 변경하는 데 필요한 행을 업데이트 아는 것을 다른 곳 말했다.
나는이 코드에 흥미가 없지만 결코 MySQL 전문가 (분명히)는 여기에 일어나고있는 것을 조금 더 설명해 주시겠습니까? 감사합니다 – NightMICU
저는 제 대답을 확장했습니다. 그것이 의미가 있기를 바랍니다. –
대단히 감사합니다! 나는이 시도를 해봐야 할 것 같네. – NightMICU