Мне нужно получить всю таблицу и выполнить некоторые вычисления в цикле, как это сделать, мой пример:
$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с макс, это возможно?
Сервер:
Таблица — 100 тыс. Записей, размер таблицы — 23,6 МБ
Мне не ясно, должны ли вычисления выполняться в коде PHP или могут быть перенесены в SQL (например, процедуры MySQL). Но если последнее так, я бы посоветовал вам взглянуть на процедуры MySQL. При вашем подходе вы передаете много данных между клиентом PHP и сервером MySQL. И в итоге это не очень масштабируемое решение.
Других решений пока нет …