#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).