Войти

Показать полную графическую версию : Создание сложной выборки из MySQL


Vlad Drakula
16-06-2004, 22:13
есть:

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

Vlad Drakula
16-06-2004, 23:12
mar
первый запрос со вторым объединьто не получится!
просто не получится, а если у тебя получится то я буду очень за тебя рад!

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

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

Vlad Drakula
16-06-2004, 23:21
mar
нужно как SELECT sum(l.ByteSent) as Max_byte,  count(*) as Max_count
но при этом order by одно и другое даст совсем не то!

mar
18-06-2004, 09:56
UNION - в одном случае order by одно, в другом - другое. Или mysql этого не умеет?

Vlad Drakula
18-06-2004, 19:51
mar
в общем я все попробовал и пришол к выводу:

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

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

Vlad Drakula
18-06-2004, 22:12
mar
а вот в том и дело!!!
я тоже сначала не поверил, нопотом провел несколько тестов с замером скорости.

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

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

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

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

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

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

Vlad Drakula
19-06-2004, 00:18
mar
я же говорил что это шаманство!
я работаю с запросами из скриптов.

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

Vlad Drakula
19-06-2004, 00:36
mar
дело в том что мне результат нужен не в чистом виде, мне нужна обшая производительность, по этому я и мерию ее косвенным методом.

mar
19-06-2004, 10:22
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 - неудивительно, что приходится плясать с бубном :)
ЗЫ это не наезд. это размышления вслух - приемы тестирования не только тебе приходится продумывать :)

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




© OSzone.net 2001-2012