【问题标题】:Data Base Design for Laravel-Lumen APILaravel-Lumen API 的数据库设计
【发布时间】:2019-08-27 14:20:39
【问题描述】:

我需要为我即将使用 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 查询会减慢你的应用程序,所以任何建议,想法将不胜感激

【问题讨论】:

  • 确保您有正确的索引。分页您的商品,以便消费者决定他们想要多少页商品。

标签: mysql sql laravel database-design


【解决方案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 语句尝试识别正在发生的事情 (https://dev.mysql.com/doc/refman/5.7/en/using-explain.html)。

【讨论】:

    猜你喜欢
    • 2018-04-11
    • 2013-06-19
    • 2020-12-14
    • 2016-07-03
    • 2020-05-20
    • 2016-11-26
    • 2021-11-08
    • 2020-11-21
    • 1970-01-01
    相关资源
    最近更新 更多