Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Вебмастеру (http://forum.oszone.net/forumdisplay.php?f=22)
-   -   Создание сложной выборки из MySQL (http://forum.oszone.net/showthread.php?t=31141)

Vlad Drakula 16-06-2004 22:13 213598

есть:
Код:

 $MaxByte = mysql_fetch_array(mysql_query('SELECT sum(l.ByteSent) as Max
                                              FROM logs as l, brouser as b
                                             WHERE l.Date >= "'.$StartDate.'"
                                               AND l.Date <= "'.$EndDate.'"
                                               AND ( '.$r.' )
                                               AND b.id=l.Brouser
                                          GROUP BY l.QueryString, l.Result
                                          ORDER BY Max DESC;')) or print mysql_error();

  $MaxCount = mysql_fetch_array(mysql_query('SELECT count(*) as Max
                                               FROM logs as l, brouser as b
                                              WHERE l.Date >= "'.$StartDate.'"
                                                AND l.Date <= "'.$EndDate.'"
                                                AND ( '.$r.' )
                                                AND b.id=l.Brouser
                                           GROUP BY l.QueryString, l.Result
                                           ORDER BY Max DESC;')) or print mysql_error();

  if( isset( $HTTP_GET_VARS['cuturl'] ) )
  $QueryStringList = mysql_query('SELECT IF( LOCATE("?", l.QueryString) = 0, l.QueryString, LEFT(l.QueryString, LOCATE("?", l.QueryString)  - 1) ) as QueryString,
                                  count(*) as Count,
                                  sum(l.ByteSent) as AllByteSent,
                                  l.Result,
                                  sum(l.ByteSent) / '.$MaxByte['Max'].' as prb,
                                  count(*) / '.$MaxCount['Max'].' as prc
                             FROM logs as l, brouser as b
                            WHERE l.Date >= "'.$StartDate.'"
                              AND l.Date <= "'.$EndDate.'"
                              AND ( '.$r.' )
                              AND b.id=l.Brouser
                         GROUP BY l.QueryString, l.Result
                         '.$sort.';') or print mysql_error();
  else
  $QueryStringList = mysql_query('SELECT l.QueryString as QueryString,
                                  count(*) as Count,
                                  sum(l.ByteSent) as AllByteSent,
                                  l.Result,
                                  sum(l.ByteSent) / '.$MaxByte['Max'].' as prb,
                                  count(*) / '.$MaxCount['Max'].' as prc
                             FROM logs as l, brouser as b
                            WHERE l.Date >= "'.$StartDate.'"
                              AND l.Date <= "'.$EndDate.'"
                              AND ( '.$r.' )
                              AND b.id=l.Brouser
                         GROUP BY l.QueryString, l.Result
                         '.$sort.';') or print mysql_error();

как это можно про оптимизировать?

mar 16-06-2004 22:55 213599

первый запрос со вторым объединить :)
(вообще всегда все, что можно сделать средствами SQL не надо перекладывать на PHP)
ну, а дальше в зависимости от того, как выглядит структура данных, сиречь таблицы. Может уже и некуда оптимизировать :)
Ты  EXPLAIN - ом все это хозяйство смотрел?

Vlad Drakula 16-06-2004 23:12 213600

mar
первый запрос со вторым объединьто не получится!
просто не получится, а если у тебя получится то я буду очень за тебя рад!

mar
может ты выскажешь идею как их можно объединить?

mar 16-06-2004 23:17 213601

SELECT sum(l.ByteSent) as Max_byte,  count(*) as Max_count
.......
order by одно и другое. Или в этом и дело? Тогда UNION использовать

Vlad Drakula 16-06-2004 23:21 213602

mar
нужно как SELECT sum(l.ByteSent) as Max_byte,  count(*) as Max_count
но при этом order by одно и другое даст совсем не то!


mar 18-06-2004 09:56 213603

UNION - в одном случае order by одно, в другом - другое. Или mysql этого не умеет?

Vlad Drakula 18-06-2004 19:51 213604

mar
в общем я все попробовал и пришол к выводу:

если выборки из одной таблици то лучьше делать два отдельных запроса причем без LIMIT, если выборки из разных, но быстрее один запрос с LIMIT.

mar 18-06-2004 21:41 213605

Vlad Drakula
ну, с хорошим limit-ом, конечно, всегда все быстрее :) И вообще все хорошо, что хорошо (судя по соседнему топику :)) кончается

Vlad Drakula 18-06-2004 22:12 213606

mar
а вот в том и дело!!!
я тоже сначала не поверил, нопотом провел несколько тестов с замером скорости.

сейчас я пишу статью об оптимизации MySQL, возможно к выходным закончу.

насапом деле половуну верменипотраченного на оптимизацию я трачу на чистое шаманство!

так на пример если между GROUP BY и ORDER BY есть перенос сторки то это в моих запросах приводин к стабильному увеличению времени на 0,01с, а для WHERE и AND все в точности до наоборот!

причем это на каждом сочитани в запросе!

но самое паганое это винда... от ее настроения зависит слишком многое...
я сейчас подумываю о том чтобы обзавестись отдельным компом под линуксом для размещения на нем веб сервера.

mar 19-06-2004 00:14 213607

Vlad Drakula
ну насчет перевода строк и прочего... Странно это все как-то.
Ты из командной строки работаешь? или каким-нибудь phpmyадмином? или это запросы в php-ых скриптах.

Vlad Drakula 19-06-2004 00:18 213608

mar
я же говорил что это шаманство!
я работаю с запросами из скриптов.

mar 19-06-2004 00:29 213609

бред какой-то, причем с базами данных вряд ли связанный.
При проверки бд надо запрос давать прямо в ней ручками и c чем-нибудь что-нибудь вроде EXPLAIN (в других бд есть еще более удобные средства, вроде EXPLAIN ANALYZE в postgres-е),
а то опять слишком много неизвестных - опыт не в чистом виде получается.

Vlad Drakula 19-06-2004 00:36 213610

mar
дело в том что мне результат нужен не в чистом виде, мне нужна обшая производительность, по этому я и мерию ее косвенным методом.

mar 19-06-2004 10:22 213611

Vlad Drakula
ну не бывает общей производительности!!! Если, конечно не заниматься всерьез подсчетом средней температуры по больнице :o
У меня дома athlonXP2100 - моя машина, под win98 (сейчас Linux не стоит,- винта под него нет, а собираюсь переделать под XP/debian, или ALT или FreeBSD,
сервак собрала из пожертвованных остатков P166 MMX - FreeBSD 4.10 stable,
на работе ALTLinux на 1700 athlon-е,
боевой сервер с АСУ заказчика 4-процессорный PIV уж не помню какой частоты под FreeBSD.
у постоянных заказчиков сейчас хостинг на nodex (respect тебе, кстати :)) - соляра уж не помню на чем, но с кучей соседей по диску. Ну и памяти тоже всюду разное количество и разной. Могу продолжать примеры машин и конфигураций...
Как ты думаешь, один и тот же скрипт на всех этих машинах будет одинаково работать? ;)
Я более того скажу - даже запросы к БД в условных попугаях постгреса (по EXPLAIN ANALYZE) в зависимости от загрузки машины считаются по-разному.
А уж если считать вместе PHP, MySQL и windows - неудивительно, что приходится плясать с бубном :)
ЗЫ это не наезд. это размышления вслух - приемы тестирования не только тебе приходится продумывать :)

[s]Исправлено: mar, 11:47 19-06-2004[/s]


Время: 15:25.

Время: 15:25.
© OSzone.net 2001-