#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
в названии, должно получить индекс.