Laravel - 提高大数据(8m+ 行)查询读取性能的可能解决方案
Posted
技术标签:
【中文标题】Laravel - 提高大数据(8m+ 行)查询读取性能的可能解决方案【英文标题】:Laravel - Possible solutions for improving query read performance for large data (8m+ rows) 【发布时间】:2019-04-29 05:38:14 【问题描述】:我有一个使用 VueJS 前端和 mysql 作为 RDBMS 的 Laravel Web 应用程序。我目前有一个 23.8gb 的表,包含 8m+ 行,并且每秒都在增长。
在查询此数据时,我将其连接到其他 4 个表,因此整个数据集非常庞大。
我目前只提取和显示 1000 行,因为我不再需要这些了。 VueJS 在表格中显示数据,有 13 个过滤选项供用户选择,以过滤日期、名称、状态等范围内的数据。
使用 Eloquent 并使用 MySQL 索引,我已设法将查询时间缩短到可观的时间,但我需要应用程序的这一部分尽可能响应。
从过滤器启动的一些 where 子句需要 13 秒才能执行,我觉得这太长了。
我一直在做一些阅读和思考,也许 MongoDB 或 Redis 可能是一种选择,但两者都没有什么经验。
对于这种特殊情况,您认为最大化读取性能的最佳选择是什么?
如果我使用 MongoDB,我不会迁移当前数据...我基本上会有第二个数据库,其中包含所有新数据。此应用尚未投入生产,在大多数用例中,只需要最近 30 天的数据,但仍需要查询旧数据的选项,因此保留 MySQL 和 MongoDB。
我们将不胜感激。
【问题讨论】:
你的问题有点模糊,Redis、MongoDB、MySQL都是很不一样的东西。也许你应该添加一些关于这些数据是什么的信息。 嗨蒂姆,我知道它们都是不同的东西,但由于这个项目还没有进入开发阶段,我可以灵活地进行更改。我需要一个解决方案来最大化查询读取性能,如果这 3 个选项中的任何一个可以实现这一点,我就有能力实现它。该表存储来自不同商家的支付网关的交易数据。 【参考方案1】:尝试使用弹性搜索。它将加快读取过程。
【讨论】:
【参考方案2】:尝试将查询转换为存储过程。你可以像这样执行存储过程..
DB::select('exec stored_procedure("Param1", "param2",..)');
或
DB::select('exec stored_procedure(?,?,..)',array($Param1,$param2));
不带参数试试这个
DB::select('EXEC stored_procedure')
尝试使用 EXPLAIN 优化性能。
How to optimise MySQL queries based on EXPLAIN plan
【讨论】:
嗨 Arun,我知道如何在 Laravel 中执行存储过程,但我不知道这会如何提高读取性能。这将是相同的查询,但作为存储过程触发。我已经运行了 EXPLAIN 并尽可能地优化了查询。性能下降来自依赖于连接的过滤器。例如,在搜索名称、状态代码或货币时,查询执行速度非常快,但在搜索商家名称或部门名称时,执行时间会受到很大影响,因为这些列位于不同的表中并依赖于连接。 服务器的查询处理器将分析存储过程并准备最终存储在系统表中的执行计划。随后,根据存储的计划执行该过程。由于大部分查询处理工作已经执行,存储过程几乎立即执行。以上是关于Laravel - 提高大数据(8m+ 行)查询读取性能的可能解决方案的主要内容,如果未能解决你的问题,请参考以下文章