Какие поля мне нужно проиндексировать?

#mysql

#mysql

Вопрос:

Когда я запускаю запрос:

 select categories.name as CatName, items.name as ItemName, item_options.price as Price from categories
left join items on categories.id = items.category_id
left join item_options on items.id = item_options.item_id
Where categories.takeawayID = 55276
  

Получение результата занимает слишком много времени: 273 строки в наборе (3 мин 14,56 сек)

Похоже, мне нужно добавить индекс к полям? но какое именно?

Я пытаюсь добавить EXPLAIN с помощью запроса SELECT, я не понимаю, что это значит:

 mysql> Explain select categories.name as CatName, items.name as ItemName, item_options.price as Price from categories
    -> left join items on categories.id = items.category_id
    -> left join item_options on items.id = item_options.item_id
    -> Where categories.takeawayID = 55276;
 ---- ------------- -------------- ------ ------------------------------------------- --------------- --------- ----------------------- -------- ------------- 
| id | select_type | table        | type | possible_keys                             | key           | key_len | ref                   | rows   | Extra       |
 ---- ------------- -------------- ------ ------------------------------------------- --------------- --------- ----------------------- -------- ------------- 
|  1 | SIMPLE      | categories   | ALL  | NULL                                      | NULL          | NULL    | NULL                  |  14086 | Using where |
|  1 | SIMPLE      | items        | ref  | category_id_2,category_id_3,category_id_4 | category_id_2 | 4       | menu.categories.id    |      9 |             |
|  1 | SIMPLE      | item_options | ALL  | NULL                                      | NULL          | NULL    | NULL                  | 197401 |             |
 ---- ------------- -------------- ------ ------------------------------------------- --------------- --------- ----------------------- -------- ------------- 
  

Комментарии:

1. ПОДОЖДИТЕ … сервер выходит из строя? Я сомневаюсь, что это проблема с индексом. Что касается вашей операции, вы должны добавить индексы в categories.id и item_options.item_id

2. Вы правы, сбой не произошел …. 273 строки в наборе (3 мин 14,56 сек)

3. Добавьте 2 индекса, затем оптимизируйте таблицы . Затем сообщите мне результат ^^

4. Хорошо, но почему вы не выбрали items.category_id для индексации?

5. Вы используете это left join item_options on items.id = item_options.item_id здесь. Это означает, что вы могли бы воспользоваться этим, особенно учитывая, что в таблице есть 197401 строки!

Ответ №1:

Как правило, вы должны добавлять индексы ко всему, что находится в разделе join , where group by или order by .

Обычно это означает, что все, что имеет id в названии, должно получить индекс.