- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 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();
Govnocoder#0xFF 02.11.2010 11:25 # +4
vidok 02.11.2010 11:26 # +1
Lure Of Chaos 02.11.2010 11:37 # 0
а вы всмотритесь в строчки 16,31,43,55 и поймете почему
еще подзапросы в строчках 14,41,53 мне кажутся избыточными - думаю, если их вынести в отдельный запрос, можно уже будет обойтись 2ядерным сервом с 4гигами оперативы.
А если потрудитесь обьяснить задачу этого ужасного запроса, то наверное вполне можно будет сократить его обьем раз в 5, да и скорость увеличится.
istem 02.11.2010 11:48 # +9
рефакторинг -> уберите $i
Lure Of Chaos 02.11.2010 11:38 # 0
Govnocoder#0xFF 02.11.2010 11:44 # 0
vidok 02.11.2010 11:53 # 0
istem 02.11.2010 11:55 # −2
Lure Of Chaos 02.11.2010 11:56 # +2
2. далее, опять же, не вникая в код, мы видим, что визуально он представляет собой несколько похожих кусков, следовательно, количество информации в них меньше (архиваторы неплохо бы сжали) - что только подкрепляет гипотезу 1
3. далее, обращая внимание только на бросающиеся ключевые слова, видим много селектов, а так же чудовищную строку ORDER BY RAND(), что более-менее опытным кодерам известна.
4. дальше концентрат говна детектед, далее лень разжевывать кодеру, что да как
eth0 02.11.2010 18:55 # +2
Проблемы всегда начинаются, когда лезут в калашный ряд те, кто не разбираются в предмете. В результате, если ещё php как-то нагрузку держит, базы начинают затыкаться на ровном месте.
Lure Of Chaos 03.11.2010 11:52 # 0
К примеру, в университете у нас, помнится, был предмет "системы управления базами данных", и там, среди прочих базовых знаний, учили даже нормальным формам вплоть до четвертой. Предмет пройден, то есть, считается, что нас обучили как следует. Однако про оптимизацию запросов пришлось интересоваться самому + здравый смысл + эмпирический опыт.
eth0 03.11.2010 18:43 # +1
Не думаю, что интститут мне дал что-то кроме скупого базиса. Ну, по крайней мере, с join'ами пришлось разбираться самостоятельно.
Тем не менее, некоторые отрасли требовательнее к кодомартышкам, нежели другие. И запросы подобного рода, например, им с рук уже не сходят. Тут уже не скачать компонент, который "сделает все хорошо". И не скопипастить кусочек функции на форуме. Вот и получается, что регулярки у обезьян - совершенно ненормальные, запросы жрут сотни памяти через одного.
Уметь писать запрос и уметь написать корректный запрос - два совершенно разных умения.
Анонимус 03.11.2010 21:19 # +1
есть два совершенно разных подхода, и их носители друг друга не понимают.
первый: "мне надо работать с FOO. Сейчас я разберусь, как с ней правильно работать, пойму ее идеологию, почитаю бестпрактисы, подпишусь на рассылку, и через недельку буду сносно рубить в FOO".
второй: "мне надо работать с FOO. Но времени (да и сил) разбираться с ним нет. В конце концов -- я же специалист по BAR , а не по FOO, мне не за это платят. Сейчас я скопирую готовый код с форума, и если он заработает -- все ок. Если что-то сглючит -- будем разбираться, в конце концов на форуме мне всегда помогут".
Я видел такое и среди админов и среди программеров.
istem 03.11.2010 23:02 # 0
---
PS копипаста - зло...
Анонимус 04.11.2010 04:09 # 0
а потом:
--зачем ты пишешь десктопное приложение и демона на php?
--потому что я php уже знаю, а другие языки -- нет
Lure Of Chaos 04.11.2010 13:31 # 0
bugmenot 04.11.2010 22:14 # 0
istem 04.11.2010 22:48 # 0
Vasiliy 08.11.2010 16:29 # 0
Lure Of Chaos 09.11.2010 21:58 # 0
bugmenot 03.11.2010 19:13 # 0
копипастить точно умеет
fey 02.11.2010 12:46 # +1
Анонимус 02.11.2010 15:54 # 0
Lure Of Chaos 02.11.2010 16:23 # +3
Arigato 02.11.2010 22:16 # +1
Не уж-то все дело в инкременте $i... :)
danilissimus 06.11.2010 19:03 # 0
istem 06.11.2010 23:43 # 0
guest 07.02.2017 13:01 # 0