Разработка базы данных для Laravel-Lumen API

#mysql #sql #laravel #database-design

#mysql #sql #laravel #база данных-дизайн

Вопрос:

Мне нужна помощь с дизайном базы данных и взаимосвязями таблиц для моего предстоящего проекта с Laravel-Lumen, чтобы максимально сократить время запроса, ниже я опишу все мои таблицы и конечные точки API (я перечислю только необходимые файлы из каждой таблицы)

 Table - Customer
-id
-name
-image
.
.


Table - Item
-id
-customer_id
-name
-price
-image
.
.
  8 more


Table Item_color

-id
-item_id
-red
-black
.
.

Table Favorites

-id
-user_id
-item_id
  

Мои конечные точки — это :

  • GetItems (перечислить все элементы)
  • getUseFavorites (список избранных элементов пользователя)

Примечание: я не использовал красноречивые отношения.

 SELECT * from item, customer.name, customer.img_url,customer.location,item_color.red,item_color.blue,item_color.white
JOIN customer ON item.id = customer.id
JOIN sidedish ON item.id = item_color.item_id
WHERE item.location = $location
  

Для первой конечной точки я должен получить все поля элементов имя клиента, изображение и местоположение все цвета элемента (для этого запроса я использую JION)

Для второй конечной точки я должен получить все избранные элементы пользователя, которые я также использую JOIN.

Моя проблема после запуска фабрик с более чем 500 пользователями и элементами и 50 избранными элементами на пользователя заключается в том, что время запросов заняло 3,8 секунды для достижения вышеуказанных конечных точек, поэтому теперь я думаю, что, если приложение достигнет 10000 пользователей или более? после поиска я обнаружил, что во многих статьях говорится, что использование неоптимизированного запроса JION замедлит работу вашего приложения, поэтому любые предложения, идеи будут высоко оценены

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

1. Убедитесь, что у вас есть правильные индексы. Разместите свои элементы так, чтобы потребитель сам решал, сколько страниц элементов ему нужно.

Ответ №1:

Запросы выполняются очень медленно, когда в вашей базе данных нет индекса, все первичные ключи и внешние ключи должны быть проиндексированы, вы можете определить это при ваших миграциях (https://laravel.com/docs/5.8/migrations#indexes).

По указанию @adam разбейте результаты на страницы (https://laravel.com/docs/5.8/pagination#paginating-eloquent-results).

Третий совет — возвращайте только необходимые поля, поэтому используйте select('name', 'image') , чтобы получить только то, что вам нужно (https://laravel.com/docs/5.8/queries#selects).

Используйте отношения модели, это не улучшит время запроса, но увеличит время разработки.

Если вы используете MySQL или MariaDB, вы можете распечатать инструкцию sql с помощью метода toSql() (https://scotch.io/tutorials/debugging-queries-in-laravel ) и используйте EXPLAIN инструкцию, чтобы попытаться определить, что происходит (https://dev.mysql.com/doc/refman/5.7/en/using-explain.html).