mysql - Laravel Web 应用程序的可扩展性

标签 mysql optimization laravel

我们正在运行一个用 Laravel 编码的基于 MySQL/PHP 的网络应用程序。基本上,我们用它来管理电脑维修店的服务工作/工作单。我们那里有近 2500 个工单,有时运行速度有点慢,尤其是当多个技术人员输入或更新工单时。使它更快、更有效地工作的最佳方法是什么,尤其是当我们继续增加客户和工作订单时。服务器在 Linux Software RAID1 中运行 CentOS 6 x64、cPanel、Intel Xeon E3、2x Enterprise SATA。 谢谢!

最佳答案

不确定一个答案在指定解决方案时能深入到什么程度,但有许多最佳实践可供遵循。我认为这就是您所追求的,因为您没有指定任何特定的瓶颈。

一些快速提示是

  • 缓存您的查询:

因此,如果在您的应用程序上运行查询,其数据仅每 x 天更新一次,为什么不将其缓存 x 天,以便您的数据库避免在两者之间被不必要地击中?来自 docs 的示例:

$value = Cache::remember('users', $minutes, function()
{
    return DB::table('users')->get();
});
  • 利用队列:

当用户更新工作订单(电子邮件、调用其他逻辑)时,后​​台任务可能正在运行,这可能需要一些时间并导致用户不得不等待。与其让这些任务在那一刻运行并降低用户的速度,不如将它们排队等待稍后运行。 Laravel supports许多不同的队列驱动程序用于此目的。我个人用过Beanstalk但你可以尝试类似 IronMQ 的东西

Beanstalk 的基本用法:更改/app/config/queue.php 以指定您的默认队列驱动程序和任何配置,包括队列名称:

'default' => 'beanstalkd',


'beanstalkd' => array(
        'driver' => 'beanstalkd',
        'host'   => 'localhost',
        'queue'  => array('default','SendEmail'),
    ),

然后,在您的 Controller 中,您可以执行以下操作以推送到该队列:

Queue::push('SendEmail', array('message' => 'Something...'));

仅供引用,Fideloper 拥有出色的 tutorial对此。

  • 警惕 n+1 问题并使用预先加载:

docs解释这个问题。

  • 考虑切换到 NoSql 数据库,如 MongoDB(完全取决于要求):

正如我提到的,这完全取决于您的应用程序和您正在做的事情,但在某些情况下,在 MySQL 上使用 NoSql 数据库有其优点。您可以利用分片和复制来帮助使用 MongoDB 扩展您的应用程序,但当然不仅限于 mongo。

您还可以做很多其他事情,但仅凭上述提示,我认为您可以使您的应用更快、更高效。

关于mysql - Laravel Web 应用程序的可扩展性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23448715/

相关文章:

scala - Spark : sc. WholeTextFiles 执行时间过长

c++ - Visual Studio调试优化如何工作?

javascript - 拉维尔 5.6 : intl-tel-input compatibility issue with App. js

mysql - SQL - 计算可变长度的可变移动平均值

php - mysql fetch assoc 用于 url 获取

java - 有哪些方法可以优化在 Android 上运行的服务?

laravel - Route::redirect 在 Laravel 5.5+ 中使用通配符

php - 禁用 laravel 的内置错误屏幕

php - Mysql 主表不存在时自动插入记录

mysql - MYSQL中如何返回多个结果集或字符串数​​组