【发布时间】:2012-07-02 22:20:18
【问题描述】:
我最近为一所处理近 200 个表的大学构建了一个相当复杂的数据库应用程序。一些表(例如 Publications)可以包含 30 个或更多字段并存储 10 个一对一 FK 关系和最多 2 或 3 个多对多 FK 关系(使用交叉引用-ref 表)。我自始至终都使用整数 ID,规范化一直是每一步的关键。 AJAX 是最小的,大多数页面都是标准的 CRUD 表单/流程。
我使用过 Symfony 1.4、Doctrine ORM 1.2、MySQL、PHP。
虽然开发时间和易于维护的好处是巨大的(在使用 MVC 和 ORM 时),但我们一直在速度方面遇到问题。也就是说,当我们有多个用户在任何时候登录并处于活动状态时,应用程序会显着变慢(保存或编辑记录最多需要 20 秒)。
我们目前正在与我们的系统管理员进行讨论,但他们说我们应该拥有足够的权力。当有 6 个或更多用户参与活动时,我们最终会在虚拟服务器环境中将 4 个 CPU 排队,而内存使用率很低(没有出血)。
当然,我们正在考虑对我们的 mySQL 应用程序进行多线程处理(如果这会有所帮助),优化我们的代码(尽管其中大部分是由 MVC 生成的)并优化我们的缓存使用(这可能会更好,尽管使用的大部分屏幕是用户登录特定和动态的);我们已经安装了 APC、额外的内存、对我们的数据库进行了碎片整理、我已经尝试取消设置所有记录集(尽管我知道这现在在 ORM 中是自动的)、发起手动垃圾回收......
但我要问的问题是,mySQL、PHP 和 Symfony MVC 一开始对于开发这种规模的应用程序是否真的是一个糟糕的选择?如果是这样,对于这种规模/复杂性的基于 Web 的数据库界面应用程序,人们通常使用/推荐什么?
【问题讨论】:
-
对不起,也许我的意思是多通道我们的 mySQL 数据库..
-
那么您确定是哪个进程占用了资源吗?如果没有看到内存和 CPU 崩溃的原因,进行优化是没有意义的。另外,您有什么保证您的查询是最佳的?表的数量无关紧要,重要的是数据的大小,它的索引方式决定了 b 树的大小和内存消耗(假设您使用的 InnoDB 具有足够大的 buffer_pool_size)。所以回答你的问题很困难,任何人都可以猜出问题所在。将其归咎于学说或php还为时过早,请检查哪个进程先吃资源。
-
如果您对自己的系统感到满意,我会在放弃之前对其进行优化。有很多因素。首先想到的是,对于正在运行的查询,您的数据库中可能没有正确的索引。打开你的慢查询日志,检查你在那里找到的查询,使用解释命令来判断慢查询是否正在执行未索引的搜索。根据需要添加索引。
-
亲爱的NB和 AllInOne,我已经索引了所有 FK 关系。没有任何未编入索引的查询。关于慢查询,是的,您是对的,但其中大多数是由 Symfony 构建的。我确实将 table_methods 应用于大多数具有根别名扩展的列表查询,并且我确实倾向于使用代数语法进行 SQL 连接(这真的很糟糕吗??)。
-
然而,我的问题实际上比要求精确定位可能出现的问题更为笼统。我以前没有自己构建过这么大的系统,我想知道是否有更好/更值得推荐的技术来做这种事情?也许不是..
标签: php mysql orm symfony1 cpu-speed