Cardee
Новичок
Если две таблицы:
С индексами:
С индексом PRIMARY на id и связью `template`.`id` = `pages`.`id`.
Частый запрос, в котором суть проблемы, для получение `pages`.`id` с минимальным значением `pages`.`remove`, у которого есть в наличие запись в `template`:
В принципе всё работает быстро, но
Объясните, пожалуйста, почему MySQL использует индекс url, а не url_id_remove? Почему при наличие индексов на все поля, участвующие в запросе, мне предлагается использовать индексы?
Код:
mysql> SELECT * FROM `pages` WHERE `url` = "/url";
+--------+----------+----------+
| id | url | remove |
+--------+----------+----------+
| 1 | /url | 0 |
+--------+----------+----------+
| 2 | /url | 1 |
+--------+----------+----------+
| 3 | /url | 2 |
+--------+----------+----------+
- PRIMARY на id;
- уникальный индекс url на url и remove
- индекс для частого запроса url_id_remove на все три столбца
Код:
mysql> SELECT * FROM `template` WHERE `id` IN (1, 2, 3);
+--------+--------+
| id | tpl |
+--------+--------+
| 1 | 1 |
+--------+--------+
| 2 | 1 |
+--------+--------+
| 3 | 1 |
+--------+--------+
Частый запрос, в котором суть проблемы, для получение `pages`.`id` с минимальным значением `pages`.`remove`, у которого есть в наличие запись в `template`:
Код:
mysql> SELECT `pages`.`id` FROM `pages`, `template` WHERE `pages`.`url` = "/url" AND `template`.`id` = `pages`.`id` ORDER BY `pages`.`remove` ASC LIMIT 1;
Код:
mysql> EXPLAIN SELECT `pages`.`id` FROM `pages`, `template` WHERE `pages`.`url` = "/url" AND `template`.`id` = `pages`.`id` ORDER BY `pages`.`remove` ASC LIMIT 1;
+----+-------------+----------+--------+---------------------------+---------+---------+-------------+------+--------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+----------+--------+---------------------------+---------+---------+-------------+------+--------------------------+
| 1 | SIMPLE | pages | ref | PRIMARY,url,url_id_remove | url | 767 | const | 1 | Using where; Using index |
| 1 | SIMPLE | template | eq_ref | PRIMARY | PRIMARY | 3 | db.pages.id | 1 | Using index |
+----+-------------+----------+--------+---------------------------+---------+---------+-------------+------+--------------------------+