"PHP" / Говнокод #4511 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
  30. 30
  31. 31
  32. 32
  33. 33
  34. 34
  35. 35
  36. 36
  37. 37
  38. 38
  39. 39
  40. 40
  41. 41
  42. 42
  43. 43
  44. 44
  45. 45
  46. 46
  47. 47
  48. 48
  49. 49
  50. 50
  51. 51
  52. 52
  53. 53
  54. 54
  55. 55
  56. 56
  57. 57
  58. 58
  59. 59
  60. 60
  61. 61
  62. 62
  63. 63
  64. 64
function get_afisha()
{
	global $database;
	$i=2;			
	while(count($row)<4)
	{
		$query='
		(
			SELECT DISTINCT ae.id, ae.title
				FROM afisha.#__afisha_events ae
				WHERE  	ae.published = 1 AND
						ae.deleted = 0 AND
						ae.type_event = 1 AND
						ae.id IN (SELECT aed.id_event FROM afisha.#__afisha_event_dates aed WHERE aed.date >= CURDATE()) AND
						ae.city=1
				ORDER BY RAND()	
				LIMIT 1
		)
		union
		(		
			SELECT c.id,c.title		
				FROM night.#__content c 
				LEFT JOIN night.#__content_afisha_date ca 
					ON c.id = ca.id_content		
				WHERE 	c.state=1 AND 
						c.access=0 AND 
						ca.date >= CURDATE() AND 
						c.catid=5 AND
						ae.city=1
				GROUP BY c.id, ca.id_content		
				ORDER BY RAND()		
				LIMIT 1
		)
		union
		(		
			SELECT DISTINCT ae.id, ae.title
				FROM afisha.#__afisha_events ae
				WHERE  	ae.published = 1 AND
						ae.deleted = 0 AND
						ae.type_event = 4 AND
						ae.id IN (SELECT aed.id_event FROM afisha.#__afisha_event_dates aed WHERE aed.date >= CURDATE()) AND
						ae.city=1
				ORDER BY RAND()	
				LIMIT 1
		)
		union
		(
			SELECT DISTINCT ae.id, ae.title
				FROM afisha.#__afisha_events ae
				WHERE  	ae.published = 1 AND
						ae.deleted = 0 AND
						ae.type_event = 2 AND
						ae.id IN (SELECT aed.id_event FROM afisha.#__afisha_event_dates aed WHERE aed.date >= CURDATE()) AND
						ae.city=1
				ORDER BY RAND()	
				LIMIT 1
		)';		
		$database->setQuery($query);
		$row=$database->loadObjectlist();
		$i++;
	}
	return $row;
}
$row=get_afisha();

Очень нужная переменная i.

Запостил: vidok vidok, (Updated )

Комментарии (28) RSS

    • Это говно вешало наш 8 ядерный сервер с 16 гигами оперативы
      Ответить
      • > Это говно вешало наш 8 ядерный сервер с 16 гигами оперативы

        а вы всмотритесь в строчки 16,31,43,55 и поймете почему
        еще подзапросы в строчках 14,41,53 мне кажутся избыточными - думаю, если их вынести в отдельный запрос, можно уже будет обойтись 2ядерным сервом с 4гигами оперативы.

        А если потрудитесь обьяснить задачу этого ужасного запроса, то наверное вполне можно будет сократить его обьем раз в 5, да и скорость увеличится.
        Ответить
      • > Это говно вешало наш 8 ядерный сервер с 16 гигами оперативы
        рефакторинг -> уберите $i
        Ответить
      • Просто мне лень этот код вкуривать ,но раз аффтар сказал, что говно только в $i, то так оно и есть.
        Ответить
        • 1. беглый осмотр кода показывает оооочень размазанный скул-запрос, так что, при равной возможности каждой строчки на содержание говна, скул сразу попадает под подозрение
          2. далее, опять же, не вникая в код, мы видим, что визуально он представляет собой несколько похожих кусков, следовательно, количество информации в них меньше (архиваторы неплохо бы сжали) - что только подкрепляет гипотезу 1
          3. далее, обращая внимание только на бросающиеся ключевые слова, видим много селектов, а так же чудовищную строку ORDER BY RAND(), что более-менее опытным кодерам известна.
          4. дальше концентрат говна детектед, далее лень разжевывать кодеру, что да как
          Ответить
          • Предположительно, например, первый и третий куски можно объединить, при условии "type_event in (1,4 )", как минимум.
            Проблемы всегда начинаются, когда лезут в калашный ряд те, кто не разбираются в предмете. В результате, если ещё php как-то нагрузку держит, базы начинают затыкаться на ровном месте.
            Ответить
            • а что значит "разбираться в предмете"? автор сабжа вполне умеет писать скул-запросы. А оптимизация запросов это предметная область, или все же изыски опытных кодеров?

              К примеру, в университете у нас, помнится, был предмет "системы управления базами данных", и там, среди прочих базовых знаний, учили даже нормальным формам вплоть до четвертой. Предмет пройден, то есть, считается, что нас обучили как следует. Однако про оптимизацию запросов пришлось интересоваться самому + здравый смысл + эмпирический опыт.
              Ответить
              • Значит, те, кто может/хочет - те научатся. Любимая фраза же всех остальных "профессионалы построили Титаник".
                Не думаю, что интститут мне дал что-то кроме скупого базиса. Ну, по крайней мере, с join'ами пришлось разбираться самостоятельно.
                Тем не менее, некоторые отрасли требовательнее к кодомартышкам, нежели другие. И запросы подобного рода, например, им с рук уже не сходят. Тут уже не скачать компонент, который "сделает все хорошо". И не скопипастить кусочек функции на форуме. Вот и получается, что регулярки у обезьян - совершенно ненормальные, запросы жрут сотни памяти через одного.
                Уметь писать запрос и уметь написать корректный запрос - два совершенно разных умения.
                Ответить
                • тут дело в подходе.
                  есть два совершенно разных подхода, и их носители друг друга не понимают.

                  первый: "мне надо работать с FOO. Сейчас я разберусь, как с ней правильно работать, пойму ее идеологию, почитаю бестпрактисы, подпишусь на рассылку, и через недельку буду сносно рубить в FOO".

                  второй: "мне надо работать с FOO. Но времени (да и сил) разбираться с ним нет. В конце концов -- я же специалист по BAR , а не по FOO, мне не за это платят. Сейчас я скопирую готовый код с форума, и если он заработает -- все ок. Если что-то сглючит -- будем разбираться, в конце концов на форуме мне всегда помогут".

                  Я видел такое и среди админов и среди программеров.
                  Ответить
                  • есть ещё третий: "мне надо работать с FOO. Но времени (да и сил) разбираться с ним нет. В конце концов -- я же специалист по BAR. Сейчас я [немножко] пойму ее идеологию, и через недельку перепишу FOO на BAR."
                    ---
                    PS копипаста - зло...
                    Ответить
              • > автор сабжа вполне умеет писать скул-запросы
                копипастить точно умеет
                Ответить
  • прикольно, пока мы все таки 4 строки не достанем, продолжаем выбирать, получаем почти Perpetuum Mobile
    Ответить
  • > Это говно вешало наш 8 ядерный сервер с 16 гигами оперативы

    Не уж-то все дело в инкременте $i... 🙂
    Ответить

Добавить комментарий

Я, guest, находясь в здравом уме и твердой памяти, торжественно заявляю:

    А не использовать ли нам bbcode?


    8