Laravel-Lumen API的数据库设计

时间:2019-04-05 16:05:58

标签: 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(列出用户的“收藏夹”项)

注意:我没有使用雄辩的关系。

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 个答案:

答案 0 :(得分: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,则可以使用方法toSql()https://scotch.io/tutorials/debugging-queries-in-laravel)打印sql语句,并使用EXPLAIN语句来尝试识别正在发生的事情({{3} }。