Symfony2 Doctrine2 获取所有表

Posted

技术标签:

【中文标题】Symfony2 Doctrine2 获取所有表【英文标题】:Symfony2 Doctrine2 fetch all table 【发布时间】:2014-12-27 10:43:20 【问题描述】:

我需要获取所有表并在循环中进行一些计算,下注方法是什么,我的示例是:

$em = $this->getDoctrine()->getManager();

$increment = 0;

for($i = 0; $i>= 0; $i++)
    $query = $em->createQueryBuilder()
        ->select('com')
        ->from('CatalogWebBundle:ComCompany', 'com')
        ->getQuery()
        ->setMaxResults(2000)
        ->setFirstResult($increment);

    $info = $query->getArrayResult();
    if(!$info)
        break;
    $increment += 2000;

我得到了什么:

查询不是很慢231ms,但是php 6501s这个时间怎么优化到1-2s才有可能?

这是我的表结构:

CREATE TABLE IF NOT EXISTS `com_company` (
`cmp_id` int(11) NOT NULL,
  `cmp_category` int(11) DEFAULT NULL,
  `cmp_name` varchar(100) DEFAULT NULL,
  `cmp_code` int(10) DEFAULT NULL,
  `cmp_city` int(11) DEFAULT NULL,
  `cmp_vat` varchar(16) DEFAULT NULL,
  `cmp_emp` int(11) DEFAULT NULL,
  `cmp_return` varchar(255) DEFAULT NULL,
  `cmp_return_from` varchar(255) DEFAULT NULL,
  `cmp_return_till` varchar(255) DEFAULT NULL,
  `cmp_address` varchar(255) DEFAULT NULL,
  `cmp_phone` bigint(12) DEFAULT NULL,
  `cmp_email` varchar(100) DEFAULT NULL,
  `cmp_site` varchar(100) DEFAULT NULL,
  `cmp_ceo` varchar(50) DEFAULT NULL,
  `cmp_register` varchar(50) DEFAULT NULL,
  `cmp_url` varchar(100) NOT NULL
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=95749 ;


ALTER TABLE `com_company`
 ADD PRIMARY KEY (`cmp_id`), ADD KEY `cmp_city` (`cmp_city`), ADD KEY `cmp_category` (`cmp_category`);

ALTER TABLE `com_company`
MODIFY `cmp_id` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=95749;

ALTER TABLE `com_company`
ADD CONSTRAINT `com_company_ibfk_1` FOREIGN KEY (`cmp_city`) REFERENCES `com_city` (`cit_id`),
ADD CONSTRAINT `com_company_ibfk_2` FOREIGN KEY (`cmp_category`) REFERENCES `com_category` (`cat_id`);

也许我的服务器太弱了?我需要将此脚本优化到最大 1-2 秒,这可能吗?

服务器:

表 - 100k 记录,表大小 - 23,6 MiB

【问题讨论】:

【参考方案1】:

我不清楚计算是否必须在 PHP 代码中完成,或者可以移动到 SQL(例如 mysql 程序)。但如果是后者,我建议你看看 MySQL Procedures。使用您的方法,您正在 PHP 客户端和 MySQL 服务器之间传输大量数据。最后,这不是一个非常可扩展的解决方案。

【讨论】:

我不能在 mysql 里面做这个,这是复杂的计算,它是在 mysql -> php 之间进行快速传输的解决方案?

以上是关于Symfony2 Doctrine2 获取所有表的主要内容,如果未能解决你的问题,请参考以下文章

在 Doctrine2/Symfony2 中的重复条目上插入忽略

如何在 Doctrine2 (Symfony2) 中按案例排序

Symfony2 项目中的 Doctrine2 映射问题

Doctrine2 自定义类型不像主键 Symfony2 那样工作

带有 Symfony2 的 Doctrine2 无法识别数据库字符集和排序规则

Symfony2 和 Doctrine2 :用两个实体填充表单(一个复杂的场景)