Vallheru: Duża optymalizacja vall

Mariusz Siwko
05.09.2015

Nowy poradnik podkręcania vallheru w wersji 3.0 (3.0 to wersja poradnika ) Temat będzie na bieżąco aktualizowany i ewentualnie poprawiany oraz poradnik bazuje na vallheru 1.3 BETA oraz też na 1.0.9 (jednak nie wszystkie artykuły tejże wersji dotyczyć będą), starsze nie biorę pod uwagę. Będę podawać numerki linijek (ale nie zawsze) z oryginału więc jak ktoś ma coś przerobione to musi samemu szukać!

ŁĄCZENIE ZAPYTAŃ SQL

Łączenie zapytań SQL jest jedną z bardziej ciekawych rzeczy jaką oferuje język SQL szczególnie biorąc pod uwagę że to w większości przypadków skraca się czas wykonania (a to + dla serwerka ). Niestety ale w vall takiego czegoś nie ujrzymy NIGDZIE... a tak się składa że jest trochę miejsc gdzie można takowe łączenia zastosować idealnie...


Na dzień dobry polecą... LOCHY (jail.php) (v 1.0.9 oraz 1.3).

INFORMACJA: Jeśli ktoś ma dużo klientów w lochach to niech się przyjrzy na "Liczba zapytań: " w stopce...

Zaraz na początku mamy takiego SELECTA:

Kod php:
    $jail = $db -> Execute("SELECT * FROM jail ORDER BY id ASC");
w v 1.3 będzie z MySQL'owymi "ciapkami":

Kod php:
    $jail = $db -> Execute("SELECT * FROM `jail` ORDER BY `id` ASC");
Czy będą ciapki czy nie - w tym przypadku bez różnicy.

Zmieniamy ów linijeczkę na:

Kod php:
    $jail = $db -> Execute("SELECT jail.*, players.user FROM jail LEFT JOIN players ON jail.prisoner = players.id ORDER BY jail.id ASC");

Niżej mamy pętlę WHILE, a w niej:

Kod php:
            $pname = $db -> Execute("SELECT user FROM players WHERE id=".$jail -> fields['prisoner']);

(w v 1.3 będzie z ciapkami i dalej będę wklejać BEZ nich więc w tej wersji szukać "wzrokowo")

KASUJEMY tę linijkę.

2 linijki dalej mamy:

Kod php:
            $arrname[$i] = $pname -> fields['user'];


Zmieniamy na:

Kod php:
            $arrname[$i] = $jail -> fields['user'];


Wyjaśnię moze sens tego:

Kod php:
    $jail = $db -> Execute("SELECT jail.*, players.user FROM jail LEFT JOIN players ON jail.prisoner = players.id ORDER BY jail.id ASC");

Pierw SELECTem definiuje CO chcę wyciągnąć i z JAKICH tabel o czym mówi nazwa PRZED kropką:

jail.*
players.user

Jeśli ktoś by chciał "ciapkować" po MySQLowemu to tu musi uważać bo kropki musi ominąć:

`players.user` - ŹLE
`players`.user` - ŹLE
players`.user` - ŹLE
players`.`user` - ŹLE
players`.`user - ŹLE

`players`.user - DOBRZE
players.`user` - DOBRZE
`players`.`user` - DOBRZE
players.user - DOBRZE

Następnie w FROM definuje z jakiej tabeli, czyli w tym przypadku jail i poprzez LEFT JOIN dołączam drugą tabelę (players) [więcej o typach złączeń można przeczytać np tu -> http://www.forumweb.pl/viewtopic.php?p=227278 ]

Kolejna rzecz to warunek dla danych wyciaganych z drugiej tabeli:

ON jail.prisoner = players.id

Czyli chcę dostać user (players.user) od id z players (players.id)które jest takie same jak id więźnia (jail.prisoner) (Chyba logicznie, nie? )

Dalej jest standardowe sortowanie rosnące (ASC) według id z jail (jail.id)

I to wszystko, pierdl załatwiony. Teraz proszę zajrzeć w "Liczba zapytań: " w stopce...


Pozwolę sobie pisać post pod postem bo jest wygodniej, potem posklejam w większe całości.

Rynki (v 1.0.9 i 1.3)

Tu sytuacja jest identyczna - SELECTowanie imienia sprzedawcy we whilu który tworzy listę sprzedawanych przedmiotów...

imarket.php - wyszukać (linijka ok 125-126):

Dla wersji 1.3!

Kod php:
            $pm = $db -> SelectLimit("SELECT * FROM `equipment` WHERE `status`='R' AND `type`!='I' ORDER BY ".$_GET['lista'].$strOrder, 30, $_GET['limit']);
Zamienić na:

Kod php:
            $pm = $db -> SelectLimit("SELECT equipment.*, players.user FROM equipment LEFT JOIN players ON equipment.owner = players.id WHERE status='R' AND type !='I' ORDER BY equipment.".$_GET['lista'].$strOrder, 30, $_GET['limit']);

Dla wersji 1.0.9!

Kod php:
            $pm = $db -> SelectLimit("SELECT * FROM equipment WHERE status='R' ORDER BY ".$_GET['lista'].$strOrder, 30, $_GET['limit']);
Zamienić na:

Kod php:
            $pm = $db -> SelectLimit("SELECT equipment.*, players.user FROM equipment LEFT JOIN players ON equipment.owner = players.id WHERE status='R' ORDER BY equipment.".$_GET['lista'].$strOrder, 30, $_GET['limit']);
nieco niżej (w else) jest:

Dla wersji 1.3!

Kod php:
            $pm = $db -> SelectLimit("SELECT * FROM `equipment` WHERE `status`='R' AND `name`=".$strSearch." AND `type`!='I' ORDER BY ".$_GET['lista'].$strOrder, 30, $_GET['limit']);
Zamienić na:

Kod php:
                        $pm = $db -> SelectLimit("SELECT equipment.*, players.user FROM equipment LEFT JOIN players ON equipment.owner = players.id WHERE status='R' AND `name`=".$strSearch." AND type !='I' ORDER BY equipment.".$_GET['lista'].$strOrder, 30, $_GET['limit']);
Dla wersji 1.0.9!

Kod php:
            $pm = $db -> SelectLimit("SELECT * FROM equipment WHERE status='R' AND name=".$strSearch." ORDER BY ".$_GET['lista'].$strOrder, 30, $_GET['limit']);
Zamienić na:

Kod php:
            $pm = $db -> SelectLimit("SELECT equipment.*, players.user FROM equipment LEFT JOIN players ON equipment.owner = players.id WHERE status='R' AND name=".$strSearch." ORDER BY equipment.".$_GET['lista'].$strOrder, 30, $_GET['limit']);
Dalej w pętli while (wspólne dla 1.3 oraz 1.0.9) wyszukać i skasować te dwie linijki:

Kod php:
$seller = $db -> Execute("SELECT user FROM players WHERE id=".$pm -> fields['owner']);
Kod php:
$seller -> Close();
Zaś linijkę która siedziała pomiędzy nimi:

Kod php:
$arrseller[$i] = $seller -> fields['user'];
Zamienić na:

Kod php:
$arrseller[$i] = $pm -> fields['user'];

Pozostałe rynki są bez różnic w wersjach (wyjątek to amarket.php i rmarket.php które istnieją tylko w v 1.3)

pmarket.php - okolice 121-124 linijki wyszukać:

Kod php:
            $pm = $db -> SelectLimit("SELECT * FROM pmarket ORDER BY ".$_GET['lista']." DESC", 30, $_GET['limit']);
I zamienić na:

Kod php:
            $pm = $db -> SelectLimit("SELECT pmarket.*, players.user FROM pmarket LEFT JOIN players ON pmarket.seller = players.id ORDER BY pmarket.".$_GET['lista']." DESC", 30, $_GET['limit']);
Nieco nizej:

Kod php:
            $pm = $db -> SelectLimit("SELECT * FROM pmarket WHERE nazwa LIKE ".$strSearch." ORDER BY ".$_GET['lista']." DESC", 30, $_GET['limit']);
Na:

Kod php:
            $pm = $db -> SelectLimit("SELECT pmarket.*, players.user FROM pmarket LEFT JOIN players ON pmarket.seller = players.id WHERE nazwa LIKE ".$strSearch." ORDER BY pmarket.".$_GET['lista']." DESC", 30, $_GET['limit']);
Z pętli while skasować:

Kod php:
$seller = $db -> Execute("SELECT user FROM players WHERE id=".$pm -> fields['seller']);
i

Kod php:
$seller -> Close();
Zaś linijkę która siedziała pomiędzy nimi:

Kod php:
$arruser[$i] = $seller -> fields['user'];
Zamiana na:

Kod php:
$arruser[$i] = $pm -> fields['user'];  


mmarket.php - okolice 107-108 linijki wyszukać:

Kod php:
            $pm = $db -> SelectLimit("SELECT * FROM potions WHERE status='R' ORDER BY ".$_GET['lista']." DESC", 30, $_GET['limit']);
Zamienic na:

Kod php:
            $pm = $db -> SelectLimit("SELECT potions.*, players.user FROM potions LEFT JOIN players ON potions.owner = players.id WHERE status='R' ORDER BY potions.".$_GET['lista']." DESC", 30, $_GET['limit']);
Niżej jest:

Kod php:
            $pm = $db -> SelectLimit("SELECT * FROM potions WHERE status='R' AND name=".$strSearch." ORDER BY ".$_GET['lista']." DESC", 30, $_GET['limit']);
Zamiana na:

Kod php:
            $pm = $db -> SelectLimit("SELECT potions.*, players.user FROM potions LEFT JOIN players ON potions.owner = players.id WHERE status='R' AND name=".$strSearch." ORDER BY potions.".$_GET['lista']." DESC", 30, $_GET['limit']);
W pętli while skasować:

Kod php:
$seller = $db -> Execute("SELECT user FROM players WHERE id=".$pm -> fields['owner']);
Oraz (to jest już kilka linijek niżej...):

Kod php:
$seller -> Close();
Pomiędzy tymi dwoma skasowanymi linijkami wyszukać 2x:

Kod php:
$seller -> fields['user']
i zamiana na:

Kod php:
$pm -> fields['user']


hmarket.php - okolice 113-115 linijki wyszukać:

Kod php:
            $pm = $db -> SelectLimit("SELECT * FROM hmarket ORDER BY ".$_GET['lista']." DESC", 30, $_GET['limit']);
Zamiana na:

Kod php:
            $pm = $db -> SelectLimit("SELECT hmarket.*, players.user FROM hmarket LEFT JOIN players ON hmarket.seller = players.id ORDER BY hmarket.".$_GET['lista']." DESC", 30, $_GET['limit']);
Dalej jest:

Kod php:
            $pm = $db -> SelectLimit("SELECT * FROM hmarket WHERE nazwa LIKE ".$strSearch." ORDER BY ".$_GET['lista']." DESC", 30, $_GET['limit']);
Zamiana na:

Kod php:
            $pm = $db -> SelectLimit("SELECT hmarket.*, players.user FROM hmarket LEFT JOIN players ON hmarket.seller = players.id WHERE nazwa LIKE ".$strSearch." ORDER BY hmarket.".$_GET['lista']." DESC", 30, $_GET['limit']);
W pętli while skasować:

Kod php:
$seller = $db -> Execute("SELECT user FROM players WHERE id=".$pm -> fields['seller']);
Oraz:

Kod php:
$seller -> Close();
Zaś linijkę która siedziała pomiędzy nimi:

Kod php:
$arruser[$i] = $seller -> fields['user'];
Zamienić na:

Kod php:
$arruser[$i] = $pm -> fields['user'];



amarket.php (TYLKO 1.3!) - 149 linijka wyszukać:

Kod php:
            $pm = $db -> SelectLimit("SELECT * FROM `amarket` ORDER BY ".$_GET['lista']." DESC", 30, $_GET['limit']);
Zamienić na:

Kod php:
            $pm = $db -> SelectLimit("SELECT amarket.*, players.user FROM amarket LEFT JOIN players ON amarket.seller = players.id ORDER BY amarket.".$_GET['lista']." DESC", 30, $_GET['limit']);
Dalej jest:

Kod php:
            $pm = $db -> SelectLimit("SELECT * FROM `amarket` WHERE `type`='".$strSearch."' ORDER BY ".$_GET['lista']." DESC", 30, $_GET['limit']);
Zamienic na:

Kod php:
            $pm = $db -> SelectLimit("SELECT amarket.*, players.user FROM amarket LEFT JOIN players ON amarket.seller = players.id WHERE `type`='".$strSearch."' ORDER BY amarket.".$_GET['lista']." DESC", 30, $_GET['limit']);
W pętli while skasować:

Kod php:
$seller = $db -> Execute("SELECT `user` FROM `players` WHERE `id`=".$pm -> fields['seller']);
Oraz:

Kod php:
$seller -> Close();
Zaś linijkę która siedziała pomiędzy nimi:

Kod php:
$arruser[$i] = $seller -> fields['user'];
Zamienić na:

Kod php:
$arruser[$i] = $pm -> fields['user'];



rmarket.php (TYLKO 1.3!) - 123 linijka wyszukać:

Kod php:
            $pm = $db -> SelectLimit("SELECT * FROM `equipment` WHERE `status`='R' AND `type`='I' ORDER BY ".$_GET['lista'].$strOrder, 30, $_GET['limit']);
Zamiana na:

Kod php:
            $pm = $db -> SelectLimit("SELECT equipment.*, players.user FROM equipment LEFT JOIN players ON equipment.owner = players.id WHERE status='R' AND `type`='I' ORDER BY equipment.".$_GET['lista'].$strOrder, 30, $_GET['limit']);
Dalej jest:

Kod php:
            $pm = $db -> SelectLimit("SELECT * FROM `equipment` WHERE `status`='R' AND `name`=".$strSearch." AND `type`='I' ORDER BY ".$_GET['lista'].$strOrder, 30, $_GET['limit']);
Zamiana na:

Kod php:
            $pm = $db -> SelectLimit("SELECT equipment.*, players.user FROM equipment LEFT JOIN players ON equipment.owner = players.id WHERE status='R' AND `name`=".$strSearch." AND `type`='I' ORDER BY equipment.".$_GET['lista'].$strOrder, 30, $_GET['limit']);
W pętli while skasować:

Kod php:
$seller = $db -> Execute("SELECT user FROM players WHERE id=".$pm -> fields['owner']);
Oraz:

Kod php:
$seller -> Close();
Zaś linijkę która siedziała pomiędzy nimi:

Kod php:
$arruser[$i] = $seller -> fields['user'];
Zamienić na:

Kod php:
$arruser[$i] = $pm -> fields['user'];

Ufff... nareszcie koniec rynków


Outposts.php (strażnice) - ta sama sytuacja co z rynkami.

UWAGA - Dotyczy TYLKO v 1.3!




Masz wersję 1.0.9, a chcesz strażnice z 1.3 ?

Nic trudnego - wystarczy podmienić outposts.php, tpl i langa i będzie działać bez problemu tylko w langu TRZEBA zmienić kodowanie z utf-8 na iso-8859-2 (latin2), bez problemu to się zrobi w dowolnym edytorze z taką mozliwoscią, np kED (F4).




Daaaaleko bo aż w linijce 1548 jest:

Kod php:
        $op = $db -> Execute("SELECT `id`, `size`, `owner` FROM `outposts` WHERE `size`>=".$_POST['slevel']." AND `size`<=".$_POST['elevel']." AND `id`!=".$out -> fields['id']." AND `attacks`<3 ORDER BY `size` DESC");
Zamienić na:

Kod php:
        $op = $db -> Execute("SELECT `outposts`.`id`, `outposts`.`size`, `outposts`.`owner`, players.user FROM `outposts` LEFT JOIN players ON outposts.owner = players.id  WHERE `outposts`.`size`>=".$_POST['slevel']." AND `outposts`.`size`<=".$_POST['elevel']." AND `outposts`.`id`!=".$out -> fields['id']." AND `outposts`.`attacks`<3 ORDER BY `outposts`.`size` DESC");
Z pętli while skasować:

Kod php:
$objName = $db -> Execute("SELECT `user` FROM `players` WHERE `id`=".$op -> fields['owner']);
Oraz:

Kod php:
$objName -> Close();
Zaś linijkę która siedziała pomiędzy nimi:

Kod php:
$arrPlayer[$i] = $objName -> fields['user'];
Zamienić na:

Kod php:
$arrPlayer[$i] = $op -> fields['user'];  

Zgłoś swój pomysł na artykuł

Więcej w tym dziale Zobacz wszystkie