selectでwhereを使うときに早くなるのはわかるのだが、仕組みがよくわからない。
add indexでindexを追加する、ということで
mysql> describe items;
+———+———+——+—–+———+—————-+
| Field | Type | Null | Key | Default | Extra |
+———+———+——+—–+———+—————-+
| item_id | int(11) | NO | PRI | NULL | auto_increment |
| name | text | YES | | NULL | |
| price | int(11) | YES | | NULL | |
+———+———+——+—–+———+—————-+
3 rows in set (0.00 sec)
mysql> alter table items add index idx_hoge(name(5));
Query OK, 0 rows affected (0.49 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> describe items;
+———+———+——+—–+———+—————-+
| Field | Type | Null | Key | Default | Extra |
+———+———+——+—–+———+—————-+
| item_id | int(11) | NO | PRI | NULL | auto_increment |
| name | text | YES | MUL | NULL | |
| price | int(11) | YES | | NULL | |
+———+———+——+—–+———+—————-+
3 rows in set (0.00 sec)
mysql> explain select * from items;
+—-+————-+——-+——+—————+——+———+——+——+——-+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+—-+————-+——-+——+—————+——+———+——+——+——-+
| 1 | SIMPLE | items | ALL | NULL | NULL | NULL | NULL | 3 | NULL |
+—-+————-+——-+——+—————+——+———+——+——+——-+
1 row in set (0.00 sec)
あれ?
>INDEXを作成すると、データテーブルとは別に検索用に最適化された状態でデータが保存
データ型そのものを変えるとは違う? どういうことだ?
>基本的にはデータ構造に対してというより
>そのテーブルに走るSQLに対応してINDEXは設定します。
データ構造は変わらない。つまり、indexを張った後も、
mysql> describe items;
+———+———+——+—–+———+—————-+
| Field | Type | Null | Key | Default | Extra |
+———+———+——+—–+———+—————-+
| item_id | int(11) | NO | PRI | NULL | auto_increment |
| name | text | YES | MUL | NULL | |
| price | int(11) | YES | | NULL | |
+———+———+——+—–+———+—————-+
3 rows in set (0.00 sec)
name のkeyがmulになっているが。。
mysql> explain select name from hogehoge where hoge > 20000;
+—-+————-+———-+——+—————+——+———+——+——+————-+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+—-+————-+———-+——+—————+——+———+——+——+————-+
| 1 | SIMPLE | hoge | ALL | NULL | NULL | NULL | NULL | 67 | Using where |
+—-+————-+———-+——+—————+——+———+——+——+————-+
1 row in set (0.00 sec)
んん、なんか全然意味が分からない。
とりえあずindexはカラムに対して貼るってことはわかった。