MySQLは、関数内にあるときにインデックスを使用できません: MySQLでは不可能な関数のインデックスが必要です。
も参照してください。How does one create an index on the date part of DATETIME field in 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)
を使用しています。
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)
従業員1人を女性に設定します。 (それがインデックスを使用して、ほぼ瞬時あることに注意してください。)
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> 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を期待することはできません。
正しい解決策は、(使用インデックスは、ほぼ瞬時になります。)2つの更新
通告を発行することです、それはMySQLは魔法だけで、それを変更する必要がある行を更新知っていることを他の場所で言われました。
私はこのコードに興味がありますが、決してMySQLのエキスパートではありません(明らかに)、ここで何が起こっているかをもう少し説明してもらえますか?ありがとう – NightMICU
私は私の答えを拡張しました。それが意味をなされることを望む。 –
ありがとうございました!私はこれを試してみる必要があります、偉大に見える – NightMICU