Спасибо за вашу помощь
Исходное сообщение
Как можно оптимизировать? А то уходит в гейтвей таймаут на пару минут(
ПХПшеры есть?)
$database->setQuery() + $database->query(); = mysql_query
$database->setQuery("select product.product_id, product.product_sku,manufacturer.mf_name from manufacturer LEFT JOIN product_mf_xref on manufacturer.manufacturer_id = product_mf_xref.manufacturer_id LEFT JOIN product on product_mf_xref.product_id=product.product_id");
$rows = $database->loadAssocList(); - создается ассоциативный массив.
foreach($rows as $row)
$abslink = 'index.php?page=shop.product_details&product_id='.$row[product_id];
$seflink = self::getSefLink($row["mf_name"].'-'.$row["product_sku"]);
$database->setQuery("update sef_links set artificial_link='".$seflink."' where artificial_link!='".$seflink."' and original_link like '".$abslink."%'");
$database->query();
product - 10000 записей
manufacturer - 270 записей
product_mf_xref - 10000 записей
не ари ,все виснут серваки походу в ангелсе возврат ваапше по 20сек кнопка появляеца
> Illuminat [12] (20.02.11 22:56)
Да фиг знает, индексы могут спасти мир, а может ещё помочь explain
> $abslink = 'index.php?page=shop.product_details&product_id='.$row[product_id];
>
> $seflink = self::getSefLink($row["mf_name"].'-'.$row["product_sku"]);
> $database->setQuery("update sef_links set artificial_link='".$seflink."'
> where artificial_link!='".$seflink."' and original_link
> like '".$abslink."%'");
Хотя вот эта часть мне не очень понятна
Можно ведь "на лету" конструировать линки, а не пихать их в БД
> CXPOH [12] (20.02.11 23:12)
> какое max_execution_time стоит?
Только не надо умничать
кроме этого есть ещё параметры пхп и, что не мало важно, самого мускула
> Только не надо умничать
> кроме этого есть ещё параметры пхп и, что не мало важно,
> самого мускула
я не умничаю, просто это одна из возможных причин зависания сервака при запуске тяжёлых скриптов
> CXPOH [12] (20.02.11 23:14)
Не спорю, но кроме этого есть ценнейший мануал на мускуле по оптимизации запросов, к томуже автор не написал конфигурацию сервера и сколько тудой пользователей ломицца
> сколько тудой пользователей ломицца
подозреваю, что сей скрипт запускается автором лично и вручную
> Можно ведь "на лету" конструировать линки, а не пихать их
> в БД
вот тут поподробней)
как на лету сконструировать нужный линк?
update blabla set bla = getSefLink('bla2') ?
т.е. как нормально апдейтнуть внутри запроса, исользуя пхп функцию на результатах запроса?
не надо в БД держать линки. достаточно id. тем более, что это на скорость не влияет (я на 99.9% уверен)
вопрос: а важно ли использовать left join? может, inner join даст тот же результат?..
update sef_links set artificial_link=getSefLink( '(select manufacturer.mf_name from manufacturer LEFT JOIN product_mf_xref on manufacturer.manufacturer_id = product_mf_xref.manufacturer_id LEFT JOIN product on product_mf_xref.product_id=product.product_id where product_id=".$row[product_id].")-'(select product.product_sku from manufacturer LEFT JOIN product_mf_xref on manufacturer.manufacturer_id = product_mf_xref.manufacturer_id LEFT JOIN product on product_mf_xref.product_id=product.product_id where product_id=".$row[product_id].") ' where artificial_link!='".$seflink."' and original_link like 'index.php?...product_id=".$row[product_id]."
так чтоли? только не уверен или getSefLink запустится внутри sql запроса..
> А зачем в БД держать линки урлов?
это короткие линки (SEF = search engine friendly), они генерятся и автоматически и юзером
> вопрос: а важно ли использовать left join? может, inner
> join даст тот же результат?..
inner join дал тот же результат - 504 Gateway Time-out ))
product_mf_xref.manufacturer_id индекс есть?
product.product_id индекс есть?
если есть индексы, то использование inner join должно дать выигрыш.
я упустил из виду, что тут идёт внутрискриптовая обработка...foreach($rows as $row)
$abslink = 'index.php?page=shop.product_details&product_id='.$row[product_id];
$seflink = self::getSefLink($row["mf_name"].'-'.$row["product_sku"]);
$database->setQuery("update sef_links set artificial_link='".$seflink."' where artificial_link!='".$seflink."' and original_link like '".$abslink."%'");
$database->query();
если ты забыл фигурные скобки и весь код после foreach - тело цикла, то тут полная Ж... кроме того, необходимо наличие индекса по полю sef_links.original_link
> product_mf_xref
индекса нету
product.product_id - и есть индекс этой таблицы
фигурные скобки есть, чето не скопипастились
sef_links - есть индекс
CREATE TABLE `sef_links` (
`id` int(11) NOT NULL auto_increment,
`original_link` varchar(255) NOT NULL,
`artificial_link` varchar(255) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `artificial_link` (`artificial_link`)
) ENGINE=MyISAM AUTO_INCREMENT=99484 DEFAULT CHARSET=cp1251
Единственное решение которое вижу - это разбивать запрос по частям с помощью limit , скажем по 2000 записей... но это гемору дофига(
Страницы: 12 |