Ru-Board.club
← Вернуться в раздел «Web-программирование»

» Оптимизация запроса MySQL

Автор: kolyas
Дата сообщения: 01.02.2010 06:41
zerkms
получается все таки проще оставить как есть, перекинув в массив php, а там уже как обычно играться как угодно.. ?

как все таки все не просто

Добавлено:
и снова я и с нова с запросом =))
может быть для кого-то это очевидное, для меня пока это почти дремучий лес..


к категориям добавились parent_id



нужно вытащить только tv которые попадают в

kat.name="группа1" (включая дочерние, их может быть несколько)


Код:
Select
    tv.id
    tv.name
FROM
    tv    INNER JOIN tv_kat ON tv_kat.tv_id = tv.id
        INNER JOIN kat ON kat.id= tv_kat.kat_id
        AND (kat.name="Группа1" OR kat.parent_id=(SELECT id FROM kat WHERE parent_id=(SELECT id FROM kat WHERE name="Группа1")))

Автор: zerkms
Дата сообщения: 01.02.2010 08:20
никак. выгреби отдельным запросом нужные id и тут их добавь через IN ()
Автор: kolyas
Дата сообщения: 04.02.2010 15:56
как оптимальнее можно получить из таблицы kat (рисунок выше) на выходе вот это:

ID
NAME (где parent_id=0)

count (количество дочерних id для ID, где parent_id= ID )



Добавлено:

вроде сам написал..
и даже работает..

это оптимальный вариант ?

Код:
SELECT *, (@aa:=id) , (SELECT count(*) FROM kat WHERE parent_id= @aa) as count_kat FROM kat WHERE parent_id=0
Автор: kolyas
Дата сообщения: 08.02.2010 01:50
видимо ответа не будет =(
Автор: zerkms
Дата сообщения: 08.02.2010 03:07
kolyas
потому что не совсем понятно, чем ты там занимаешься.
Автор: kolyas
Дата сообщения: 08.02.2010 17:50
zerkms
..пишу простой каталог с нуля.. существующие не очень нравится..

по пути улучшаю знания основ sql .. вернее как строить запросы не допуская ошибок на старте..

p.s. благодаря вашим постам стал использовать сначала INNER JOIN и LEFT JOIN вместо подзапросов..
скорость выборки ускорилась примерно в 2 раза в моей маленькой базе, а => при проектировании большой базы я выиграю больше время и ресурсов ..

..так что огромное спасибо за ответы.. zerkms


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


p.p.s. по поводу прошлого запроса .. я его оставил, так как есть, думаю для моей задачи он оптимален..
Автор: onwars
Дата сообщения: 11.04.2010 02:13
как упростить этот код до минимума запросов?


Код:
$q2 = mysql_query("select `name_team` from `m_start` where `chemp`='".$k['name']."' LIMIT 16; ");
while( $x2 = mysql_fetch_row($q2))
{ $w2[] = $x2[0] ; }
shuffle($w2);
//////////////
$q = mysql_result(mysql_query("select `id` from `m_team` where `name`='".$w2[0]."'"),0);
$q1 = mysql_result(mysql_query("select `id` from `m_team` where `name`='".$w2[1]."'"),0);
$q2 = mysql_result(mysql_query("select `id` from `m_team` where `name`='".$w2[2]."'"),0);
$q3 = mysql_result(mysql_query("select `id` from `m_team` where `name`='".$w2[3]."'"),0);


////////////
mysql_query("INSERT INTO `m_cl` set `time`='".$realtime."', `tur`='1', `chemp`='".$k['name']."',`id_team1`='".$q."',`name_team1`='".$w2[0]."',`id_team2`='".$q1."',`name_team2`='".$w2[1]."' ;");
mysql_query("INSERT INTO `m_cl` set `time`='".$realtime."', `tur`='1', `chemp`='".$k['name']."',`id_team1`='".$q2."',`name_team1`='".$w2[2]."',`id_team2`='".$q3."',`name_team2`='".$w2[3]."' ;");
Автор: 2007GhOsT2007
Дата сообщения: 12.04.2010 01:37
Ну тут все зависит от того, какая цель этого куска кода... Кстати, а вот в первом запросе стоит ограничение на 16 записей, потом полученный массив перемешивается, а потом делаем 4 запроса на первые 4 записи. Это весь кусок кода и там будет действительно только 4 записи или код не полный? Вообщем, в случае если, если я верно все понял, должен нормально работать следующий код:

Код: $a = null;
$rows = mysql_query('SELECT `m_team`.`id` AS `tid`, `m_team`.`name` AS `tname` FROM `m_start` LEFT JOIN `m_team` ON (`m_team`.`name` = `m_start`.`name_team`) WHERE `m_start`.`chemp` = \'' . $k['name'] . '\' LIMIT 16');
while ($row = mysql_fetch_array($rows))
{
$a[] = array($row['tid'], $row['tname']);
}

$a = array_rand($a, 4);

$first = true;
foreach($a as &$item)
{
if ($first)
{
$f_id = $item[0];
$f_name = $item[1];
$first = false;
}
else
{
mysql_query('INSERT INTO `m_cl` set
`time` = \'' . $realtime . '\',
`tur`=\'1\',
`chemp`=\'' . $k['name'] . '\',
`id_team1` = \'' . $f_id . '\',
`name_team1` = \'' . $f_name . '\',
`id_team2` = \'' . $item[0] . '\',
`name_team2` = \'' . $item[1] . '\'
;');

$f_id = null;
$f_name = null;

$first = true;
}
}
Автор: onwars
Дата сообщения: 13.04.2010 19:08
вот весь код. Он служит для отбора 16 команд и создания матчей первого тура на 8игр.

Код:
$q2 = mysql_query("select `name_team` from `m_start` where `chemp`='".$k['name']."' LIMIT 16; ");
while( $x2 = mysql_fetch_row($q2))
{ $w2[] = $x2[0] ; }
shuffle($w2);
//////////////
$q = mysql_result(mysql_query("select `id` from `m_team` where `name`='".$w2[0]."'"),0);
$q1 = mysql_result(mysql_query("select `id` from `m_team` where `name`='".$w2[1]."'"),0);
$q2 = mysql_result(mysql_query("select `id` from `m_team` where `name`='".$w2[2]."'"),0);
$q3 = mysql_result(mysql_query("select `id` from `m_team` where `name`='".$w2[3]."'"),0);
$q4 = mysql_result(mysql_query("select `id` from `m_team` where `name`='".$w2[4]."'"),0);
$q5 = mysql_result(mysql_query("select `id` from `m_team` where `name`='".$w2[5]."'"),0);
$q6 = mysql_result(mysql_query("select `id` from `m_team` where `name`='".$w2[6]."'"),0);
$q7 = mysql_result(mysql_query("select `id` from `m_team` where `name`='".$w2[7]."'"),0);
$q8 = mysql_result(mysql_query("select `id` from `m_team` where `name`='".$w2[8]."'"),0);
$q9 = mysql_result(mysql_query("select `id` from `m_team` where `name`='".$w2[9]."'"),0);
$q10 = mysql_result(mysql_query("select `id` from `m_team` where `name`='".$w2[10]."'"),0);
$q11 = mysql_result(mysql_query("select `id` from `m_team` where `name`='".$w2[11]."'"),0);
$q12 = mysql_result(mysql_query("select `id` from `m_team` where `name`='".$w2[12]."'"),0);
$q13 = mysql_result(mysql_query("select `id` from `m_team` where `name`='".$w2[13]."'"),0);
$q14 = mysql_result(mysql_query("select `id` from `m_team` where `name`='".$w2[14]."'"),0);
$q15 = mysql_result(mysql_query("select `id` from `m_team` where `name`='".$w2[15]."'"),0);


////////////
mysql_query("INSERT INTO `m_cl` set `time`='".$realtime."', `tur`='1', `chemp`='".$k['name']."',`id_team1`='".$q."',`name_team1`='".$w2[0]."',`id_team2`='".$q1."',`name_team2`='".$w2[1]."' ;");
mysql_query("INSERT INTO `m_cl` set `time`='".$realtime."', `tur`='1', `chemp`='".$k['name']."',`id_team1`='".$q2."',`name_team1`='".$w2[2]."',`id_team2`='".$q3."',`name_team2`='".$w2[3]."' ;");
mysql_query("INSERT INTO `m_cl` set `time`='".$realtime."', `tur`='1', `chemp`='".$k['name']."',`id_team1`='".$q4."',`name_team1`='".$w2[4]."',`id_team2`='".$q5."',`name_team2`='".$w2[5]."' ;");
mysql_query("INSERT INTO `m_cl` set `time`='".$realtime."', `tur`='1', `chemp`='".$k['name']."',`id_team1`='".$q6."',`name_team1`='".$w2[6]."',`id_team2`='".$q7."',`name_team2`='".$w2[7]."' ;");
mysql_query("INSERT INTO `m_cl` set `time`='".$realtime."', `tur`='1', `chemp`='".$k['name']."',`id_team1`='".$q8."',`name_team1`='".$w2[8]."',`id_team2`='".$q9."',`name_team2`='".$w2[9]."' ;");
mysql_query("INSERT INTO `m_cl` set `time`='".$realtime."', `tur`='1', `chemp`='".$k['name']."',`id_team1`='".$q10."',`name_team1`='".$w2[10]."',`id_team2`='".$q11."',`name_team2`='".$w2[11]."' ;");
mysql_query("INSERT INTO `m_cl` set `time`='".$realtime."', `tur`='1', `chemp`='".$k['name']."',`id_team1`='".$q12."',`name_team1`='".$w2[12]."',`id_team2`='".$q13."',`name_team2`='".$w2[13]."' ;");
mysql_query("INSERT INTO `m_cl` set `time`='".$realtime."', `tur`='1', `chemp`='".$k['name']."',`id_team1`='".$q14."',`name_team1`='".$w2[14]."',`id_team2`='".$q15."',`name_team2`='".$w2[15]."' ;");
Автор: Delta RuBoard
Дата сообщения: 14.04.2010 04:40
onwars
попробуй вот так


Код: <?    
$q2 = mysql_query("    
    SELECT    
        m_start.name_team,
        m_team.id
    FROM
        m_start,
        m_team
    WHERE
        m_start.chemp = '".$k['name']."' AND
        m_start.name_team = m_team.name
    LIMIT 16;
");
$i = 0;
while( $x2 = mysql_fetch_assoc($q2))
{
    $w2[$i]['name_team'] = $x2['name_team'] ;
    $w2[$i]['id'] = $x2['id'] ;
    $i++;
}
$i = 0;
while ($i < 16)
{
    mysql_query("INSERT INTO `m_cl` set `time`='".$realtime."', `tur`='1', `chemp`='".$k['name']."',`id_team1`='".$w2[$i]['id']."',`name_team1`='".$w2[$i]['name_team']."',`id_team2`='".$q1."',`name_team2`='".$w2[($i+1)]['name_team']."' ;");
    $i++;
}
?>
Автор: DarkSmoke
Дата сообщения: 18.04.2010 15:26
Добрый день.
Подскажи структуру таблицы. В таблице будет храниться пункты меню сайта. Прикрепляю кратинку меню на сайте.
Спасибо.
Автор: andead
Дата сообщения: 18.04.2010 18:23
DarkSmoke
в чём собственно сложность? о_О

id, parent id, name, url, order
Автор: 2007GhOsT2007
Дата сообщения: 18.04.2010 21:03

Цитата:
вот весь код. Он служит для отбора 16 команд и создания матчей первого тура на 8игр.

Или можно попробовать мой код, но вместо $a = array_rand($a, 4); сделать shuffle($a);
Возможно, у Delta RuBoard код побыстрее будет, так как используется while, против моего foreach, но мой более гибкий... если количество команд меняется, то мой проще изменить (достаточно в запросе LIMIT поменять).
Автор: DarkSmoke
Дата сообщения: 19.04.2010 09:12

Цитата:
id, parent id, name, url, order

А можно подробнее, урл и ордер для чего, что в них хранить?

И еще там же два меню, которы отдельно выводятся друг от друга, но зависят от верхнего меню. если их так делать, то как я их разграничу.. все в одном массиве будет?
Автор: andead
Дата сообщения: 19.04.2010 09:50

Цитата:
урл и ордер для чего

пункт меню же должен куда то ссылаться, order — порядок сортировки.


Цитата:
И еще там же два меню, которы отдельно выводятся друг от друга, но зависят от верхнего меню. если их так делать, то как я их разграничу.. все в одном массиве будет?

у "меню, которы отдельно выводятся друг от друга, но зависят от верхнего меню" будет один родитель (parent id) то самое верхнее меню



Добавлено:
а вообще такие крошечные структуры можно хранить в виде сериализованных массивов
Автор: DarkSmoke
Дата сообщения: 19.04.2010 21:19

Цитата:
а вообще такие крошечные структуры можно хранить в виде сериализованных массивов

Прочел про сериализацию масивов. Ну млин тяжко как то. Можно разжевать?

Добавлено:
Как их применять
Автор: andead
Дата сообщения: 19.04.2010 21:41

Цитата:
Как их применять

кого "их"?
Автор: DarkSmoke
Дата сообщения: 19.04.2010 23:01
сериализованные массивы
Автор: Cheery
Дата сообщения: 19.04.2010 23:02
DarkSmoke

Цитата:
сериализованные массивы

сериализация используется только для сохранения массивов в файлах или базах данных.
сериализовали в строку - сохранили..
когда надо, прочитали, и десериализовали обратно в массив
Автор: Ternik
Дата сообщения: 20.04.2010 10:09
Cheery


Цитата:
сериализация используется только для сохранения массивов в файлах или базах данных.

+ в сессию =)
Автор: israel_rider
Дата сообщения: 20.04.2010 13:23
Ternik
Цитата:
+ в сессию =)

Не понимаю. Сессия автоматически преобразовывает массив в формат, подходящий для хранения. Я всегда просто сохраняю массив в сессии, ни чего с ним специально для этого не делая. То есть, что бы сохранить массив в сессию, ни какая сериализация не требуется.
Автор: 2007GhOsT2007
Дата сообщения: 20.04.2010 14:02
А зачем так заморачиваться? Если структура крошечная и проект небольшой, то почему бы в отдельном php-файле этот массив не сохранить и не инклюдить его в нужных местах? И быстрее и без заморочек будет, но вот при рефакторинге будет неудобно, придется переделывать... Ну для начала весь удобно и быстро выйдет, но вот для изменения менюшки нужно будет иметь доступ к самим php-файлам, но думаю что это проблема.
Автор: Cheery
Дата сообщения: 20.04.2010 16:45
Ternik

Цитата:
в сессию =)

я же написал - в файлах..
israel_rider

Цитата:
То есть, что бы сохранить массив в сессию, ни какая сериализация не требуется

потому что делается автоматоматически
Автор: Delta RuBoard
Дата сообщения: 21.04.2010 04:40
сделай проверку по гентайму - получишь ответ на свой вопрос
Автор: onwars
Дата сообщения: 21.04.2010 16:32
Снова нуждаюсь в вашей помощи. Нужно оптимизировать запрос

Код: $q2 = mysql_query("SELECT * FROM `m_player` where `kom`='1' and `sostav`='1';");
$i = 0;
/* Опит */
$r=rand(5,50);
/* Травма */

$ttime = rand(7200,86400);
$ttime = $realtime + $ttime;

if($krr1['trener'] >= 1){
$r=round($r*1.5*$krr1['trener']);
}

while( $x2 = mysql_fetch_assoc($q2))
{
/* Карточки1 */
$kardr=rand(10,10);
$travma=rand(1,10);

$w2[$i]['opit'] = $x2['opit'] + $r;
$w2[$i]['name'] = $x2['name'] ;
    $w[] = $x2['name'];
    
$w2[$i]['fiz'] = $x2['fiz'] ;
$w2[$i]['voz'] = $x2['voz'] ;
$w2[$i]['rm'] = $x2['rm'] ;
    
    $w2[$i]['otbor'] = $x2['otbor'] ;
    $w2[$i]['opeka'] = $x2['opeka'] ;
    $w2[$i]['drib'] = $x2['drib'] ;
    $w2[$i]['priem'] = $x2['priem'] ;
    $w2[$i]['vonos'] = $x2['vonos'] ;
    $w2[$i]['pas'] = $x2['pas'] ;
    $w2[$i]['sila'] = $x2['sila'] ;
    $w2[$i]['tocnost'] = $x2['tocnost'] ;
    $w2[$i]['tal'] = $x2['tal'] ;
    $w2[$i]['disk'] = $x2['disk'];
    $w2[$i]['sostav'] = $x2['sostav'] ;
    $w2[$i]['red_kard'] = $x2['red_kard'] ;
    $w2[$i]['kard'] = $x2['kard'] ;
    $w2[$i]['travma'] = $x2['travma'] ;
    /* Обновление карток */
    if($arr1['disk'] != 0){
    $w2[$i]['disk'] = $x2['disk'] - 1 ;
    }
    if ($kardr == 10){
    mysql_query("update `m_player` set `sostav`= '0',`red_kard`= '1', `kard`= `kard`+1, `disk` = `disk`+2 where `name`='".$w[6]."' ;");
    $kardka2 = 'Игрок '.$w2[$i]['name'].' из команды '.$arr['name_team1'].' получает красную карточку и не сможет играть две игры. ';
    }else{$kardka2 = '';}
    if ($travma == 7){
    
    
    $vr1 = round(($ttime- $realtime )/3600);
    $travm = 'Игрок '.$w2[$i]['name'].' из команды '.$arr['name_team1'].' получает травму и не сможет играть '.$vr1.' часов. ';
    mysql_query("update `m_player` set `sostav`= '2', `travma`= '1', `ttime`='".$ttime."' where `id`='".$w[5]."' ;");
    }else{$travm = '';}

$mast = $w2[$i]['otbor'] + $w2[$i]['opeka'] + $w2[$i]['drib'] + $w2[$i]['priem'] + $w2[$i]['vonos'] + $w2[$i]['pas'] + $w2[$i]['sila'] + $w2[$i]['tocnost'];
$sila1 = $sila1 + $w2[$i]['rm'];
$fiza1 = $w2[$i]['fiz'] - $w2[$i]['voz'];
$rmm1=round($mast*$w2[$i]['tal']/100*$fiza1);
$i++;
}
$i = 0;
while ($i < 25)
{
mysql_query("update `m_player` set
`opit`='".$w2[$i]['opit']."',
`fiz`='".$fiza1."',
`rm`='".$rmm1."',
`mas`='".$mast."',

`disk`= '".$w2[$i]['disk']."',

where `name`='".$w2[$i]['name']."' ;");
$i++;
}
Автор: Tstf
Дата сообщения: 21.07.2010 18:28
имеется два запроса

        $sql = "SELECT b.name AS `brand_name`, g.id as `id`, g.name as `name`, g.brand_id as `brand_id`, g.sef_name as `sef_name` FROM " . $tabl_prefix . "_goods g left join " . $tabl_prefix . "_brands b on (b.id = g.brand_id) WHERE g.subsection_id = '{$id_s}' {$condition} {$brand_condition} {$price_condition} {$show_condition} GROUP BY 1,2,3,4,5 ORDER BY `name`";

и

        $sql = "SELECT g.id as `id`, g.name as `name`, g.date as `date`, g.brand_id as `brand_id`, g.image as `image`, g.sef_name as `sef_name`, avg(r.rating) as `rating` {$order_type2} FROM " . $tabl_prefix . "_goods g left join " . $tabl_prefix . "_ratings r on (g.id = r.good_id) left join " . $tabl_prefix . "_goods_vendors gv on (g.id = gv.good_id) {$order_type3} WHERE g.subsection_id = '{$id_s}' {$order_type4} {$condition} {$brand_condition} {$price_condition} {$show_condition} GROUP BY 1,2,3,4,5 {$order_type} LIMIT {$start},{$end}";

Как они с точки зрения оптимизации.

И вопрос, допустим есть Where id = '$id' AND id2 = '$id2'

Есть разница, если написать Where id2 = '$id2' AND id = '$id'
Автор: The_S
Дата сообщения: 22.07.2010 01:19
Неподготовленный запрос. Вам SQL инъекцию когда нибудь сделают.
Что по теме.
g.subsection_id - должна индексироваться.
Еще не нравится вот это `GROUP BY 1,2,3,4,5`


Цитата:
Как они с точки зрения оптимизации.
И вопрос, допустим есть Where id = '$id' AND id2 = '$id2'
Есть разница, если написать Where id2 = '$id2' AND id = '$id'

1. Экономия на спичках
2. Чисто теоретически, (expr1 and expr2), expr2 - проверятся не будет, если expr1 = false.
Так что, 1-ое если у вас выпадени условия id == '$id' менее вероятнее чем id2 == '$id2'. Но это фигня.
Автор: Tstf
Дата сообщения: 23.07.2010 22:40
The_S

Цитата:
Неподготовленный запрос. Вам SQL инъекцию когда нибудь сделают.

Интересно, в чем же моя ошибка?
Автор: The_S
Дата сообщения: 24.07.2010 14:16
Tstf
Ошибки, как таковой - нет.

Страницы: 1234

Предыдущая тема: PHP: библиотека xAJAX


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.