achyorny
23.11.2011 - 01:50
можно ли это:
$result = $this->db->query("SELECT * FROM product_to_store WHERE `product_id` NOT IN (SELECT `product_id` FROM product)");
foreach ($result->rows as $item)
$this->db->query( "DELETE FROM product_to_store WHERE `product_id` ='".(int)$item['product_id']."'" );
заменить этим:
$this->db->query( "DELETE FROM product_to_store WHERE `product_id` NOT IN (SELECT `product_id` FROM product)" );
?
FatCat
23.11.2011 - 02:12
Можно, но не нужно: работать будет намного медленнее.
_____________
Бесплатному сыру в дырки не заглядывают...
SlavaFr
23.11.2011 - 09:33
Цитата (achyorny @ 22.11.2011 - 21:50) |
можно ли это:
$result = $this->db->query("SELECT * FROM product_to_store WHERE `product_id` NOT IN (SELECT `product_id` FROM product)"); foreach ($result->rows as $item) $this->db->query( "DELETE FROM product_to_store WHERE `product_id` ='".(int)$item['product_id']."'" ); заменить этим:
$this->db->query( "DELETE FROM product_to_store WHERE `product_id` NOT IN (SELECT `product_id` FROM product)" ); ? |
не только можно, но и нужно заменить.
Первый вариант безсмысленно палит ресурсы.
_____________
↓↓↓↓↓↓↓↓↓↓ответ может быть здесьили в mysql_error();
linker
23.11.2011 - 09:36
FatCatИнтересно, что быстрее перебрать в цикле 100 записей и выполнить 100 запросов, или формально двумя запросами сразу?
_____________
Gear FrameworkGear Framework на Github
Placido
23.11.2011 - 10:24
Вместо того чтобы перебирать каждую запись из таблицы product_to_store, сравнивая с каждой записью из таблицы product, лучше удалить записи, предварительно объединив таблицы через LEFT JOIN.
DELETE `t1`
FROM `product_to_store` `t1` LEFT JOIN `product` `t2` ON `t1`.`product_id` = `t2`.`product_id`
WHERE `t2`.`product_id` IS NULL
achyorny
23.11.2011 - 16:00
Цитата (Placido @ 23.11.2011 - 06:24) |
Вместо того чтобы перебирать каждую запись из таблицы product_to_store, сравнивая с каждой записью из таблицы product, лучше удалить записи, предварительно объединив таблицы через LEFT JOIN.
DELETE `t1` FROM `product_to_store` `t1` LEFT JOIN `product` `t2` ON `t1`.`product_id` = `t2`.`product_id` WHERE `t2`.`product_id` IS NULL |
это лучше для сервера?
чем
DELETE FROM product_to_store WHERE `product_id` NOT IN (SELECT `product_id` FROM product)
?
achyornyдумаю ваш :
DELETE FROM product_to_store WHERE `product_id` NOT IN (SELECT `product_id` FROM product)
варянт совсем достаточно.
просто проиндескируите нужние поли в таблицах
_____________
когда чарли чаплин принимал участие в конкурсе: "клон чарли чаплинов", то чарли занимал третю позицию.
achyorny
23.11.2011 - 16:53
Цитата (dadli @ 23.11.2011 - 12:11) |
achyorny думаю ваш :
DELETE FROM product_to_store WHERE `product_id` NOT IN (SELECT `product_id` FROM product) варянт совсем достаточно. просто проиндескируите нужние поли в таблицах |
а зачем вообще индексировать, что оно дает?
achyorny
если индексировать product_id в таблице product_to_store то мускл будит намного бистрее поискать нужние записи, так как не будит пересмотреть все записи.
_____________
когда чарли чаплин принимал участие в конкурсе: "клон чарли чаплинов", то чарли занимал третю позицию.
Placido
23.11.2011 - 17:25
Цитата (achyorny @ 23.11.2011 - 12:00) |
это лучше для сервера?чем... |
Да в этом случае одинаково, думаю. Это я немного прогнал ))
Цитата (dadli @ 23.11.2011 - 13:03) |
если индексировать product_id в таблице product_to_store |
Только индексировать нужно поле product_id в таблице product. В таблице product_to_store в любом случае будут перебраны все product_id, и индекс там использоваться не будет.
achyorny
23.11.2011 - 17:28
ок, всем спасибо!
Placido
Цитата |
Только индексировать нужно поле product_id в таблице product. В таблице product_to_store в любом случае будут перебраны все product_id, и индекс там использоваться не будет. |
нет, наоборот, все записи будит вибран из таблиц product и не нужно его поле индексировать, а нужно индескировать product_id в таблице product_to_store. разве не так?
а вообшем если в подзапросе будит балшое киличество product_id-ов не нада вообшем индекси исползовать, в етом случае индекси уже будит лишнее.
_____________
когда чарли чаплин принимал участие в конкурсе: "клон чарли чаплинов", то чарли занимал третю позицию.
Placido
23.11.2011 - 20:51
Каждая из записей в product_to_store проверяется на соответствие условию (NOT IN ...) - то есть осуществляется простой перебор таблицы product_to_store, и смысла в использовании индекса там нет, а вот в таблице product осуществляется поиск.
Не хочу спорить - это очень легко проверить. Создайте индексы для поля product_id в обеих таблицах и проверьте с помощью EXPLAIN, какой индекс используется. Для приведенных выше запросов будет использоваться только один из этих индексов.
achyorny
21.11.2012 - 02:09
ахахах))))))
Быстрый ответ:
Powered by dgreen
Здесь расположена полная версия этой страницы.