Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: эффективность и скорость выполнения запроса
Форумы портала PHP.SU » PHP » SQL и Архитектура БД » эффективность и скорость выполнения запроса

Страниц (1): [1]
 

1. lamozavrik - 28 Февраля, 2012 - 18:37:38 - перейти к сообщению
Всем привет! Кто может подсказать, на сколько эффективен или не эффективен (медленный, ресурсоемкий и т.д.) вот такой запрос:
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. SELECT    g.id,
  3.                IF(g.cat_id = 0, 'не определена', (SELECT title FROM category WHERE id = g.cat_id)) AS cat_title,
  4.                 g.part,
  5.                 g.title,
  6.                 g.count,
  7.                 g.price,
  8.                 g.count * g.price AS sum,
  9.                 g.archive                                
  10.                                         FROM goods AS g
  11.                                         WHERE g.archive IN ($goods) ORDER BY archive, part
  12.  


Заранее благодарен
2. ugin_root - 28 Февраля, 2012 - 18:52:42 - перейти к сообщению
lamozavrik
запрос правильный. если нет другого выбора чем IF и внутри запрос то делай его. Была подобная ситуация когда нужно было делать запрос к таблице примерно для 500 записей из 10000, left outer join выполнялся очень долго (т.к было 10000 записей), а такой вариант выполнялся намного быстрее. Если ситуация похожа то делай подзапрос внутри IF. Но попробуй сделать то-же самое с left outher join, выбирай то что быстрее работает
3. lamozavrik - 28 Февраля, 2012 - 19:16:20 - перейти к сообщению
Я пробовал с INNER JOIN, но дело в том, что в INNER JOIN нужно указать условие ON к примеру id категории = id категории в таблице товаров. А ситуация такая, что при удалении категории все товары, что находятся в ней переносятся в архив, а поле id категории в товарах, которые были в удаляемой категории меняется на 0. Так вот в случае с INNER JOIN поля, в которых id категории = 0 не выбираются. Вот решил проблему так, но не знаю на сколько правильно )
4. EuGen - 29 Февраля, 2012 - 08:08:40 - перейти к сообщению
Используйте EXPLAIN. Он покажет, что именно будет делать БД.
http://dev[dot]mysql[dot]com/doc/refman/[dot][dot][dot]/en/explain[dot]html
5. lamozavrik - 29 Февраля, 2012 - 09:00:47 - перейти к сообщению
EuGen, спасибо за подсказку =))
Может еще кто подскажет, почему при условии WHERE col = 1 и ндекс используется, а при WHERE col IN (1, 2) не используется? Можно это как то исправить?
6. EuGen - 29 Февраля, 2012 - 10:00:47 - перейти к сообщению
7. lamozavrik - 29 Февраля, 2012 - 11:19:40 - перейти к сообщению
EuGen, спасибо )
8. ugin_root - 29 Февраля, 2012 - 14:24:51 - перейти к сообщению
lamozavrik
LEFT OUTER JOIN != LEFT JOIN
с той проблемой что вы описали он вам как раз поможет

 

Powered by ExBB FM 1.0 RC1