我需要为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
我的终点是:
注意:我没有使用雄辩的关系。
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查询会使您的应用变慢,因此,任何建议,想法都将受到赞赏
答案 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} }。