mysql - Laravel-Lumen API 的数据库设计

标签 mysql sql laravel database-design

我需要有关 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(列出用户收藏夹项目)

注意:我没有使用 Eloquent 关系。

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 查询会减慢您的应用程序,因此任何建议、想法将不胜感激

最佳答案

当数据库上没有索引时,查询非常慢,所有主键和外键都应该建立索引,您可以在迁移中定义它( 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,您可以使用方法 toSql() ( https://scotch.io/tutorials/debugging-queries-in-laravel ) 打印 sql 语句,并使用 EXPLAIN 语句尝试识别什么是正在发生(https://dev.mysql.com/doc/refman/5.7/en/using-explain.html)。

关于mysql - Laravel-Lumen API 的数据库设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55539457/

相关文章:

MySQL ORDER BY 补偿空列

php - 双时间数据被插入到 mysql 中

php mysql,更新查询不起作用

sql - 识别数据库中的空白表并从另一个数据库中的另一个表插入数据

php - Laravel:laravel 可翻译插件

具有高级条件的Mysql,按相关性排序

sql - 有人有 OSQL 的快速 "cheat cheat"或 "commandline reference"吗?

php - SQL 时间戳 -> 1970

php - Laravel Forge - 同一服务器上的多个站点

laravel - 如何在 Laravel 5 中将 Faker 的随机名字和姓氏连接为全名