MySQL czy tablica?

0

Ćwiczę sobie testowo różne mechanizmy związane z PHP i zrobiłem sobie taki prosty skrypt zmiany linków w pewnym <ul>. Wygląda to w ten sposób, że jest nagłówek 'NOWOŚCI', pod nim parę linków i po kliknięciu "więcej" są ładowane z bazy MySQL kolejne linki. Wszystko działa tylko, ale mam pewne pytanie związane z wydajnością. Korzystam dodatkowo z AJAX jakby co.

Na początku testowo robiłem to bez bazy, w taki sposób (mogłem to powsadzać do tablic, ładniej to upakować, ale nie o to chodzi, chodzi mi o sens):

<?PHP
    $index = $_GET['i']; //pobranie parametru, który później będzie wskazywał na indeks strony z linkami
    $body = "";

    if($index == 1){
        $body .= "<h3>NOWOŚCI</h3>\n";
        $body .= "<ul>\n";
        $body .= "<li><a href=\"#\">Pierwsze</a></li>\n";
        $body .= "<li><a href=\"#\">Drugie</a></li>\n";
        $body .= "<li><a href=\"#\">Trzecie</a></li>\n";
        $body .= "</ul>\n";
    }

    echo $body;
?>

Trochę pousuwałem tu, żeby łatwiej było ogarnąć o co mi chodzi. Potem chciałem to samo zrobić ale wsadzając te wszystkie linki, nazwy do bazy MySQL i pobierając je z niej selectem.

<?PHP

    $sql = new mysqli("localhost", "root", "root", "mosar_portfolio");
    
    if ($sql->connect_errno) {
        printf("Connect failed: %s\n", $mysqli->connect_error);
    exit();
    }

    $result = $sql->query("SELECT * FROM Newest");
    $index = $_GET['i'];
    $body = "";

    if($index == 1){
        $body .= "<h3>NOWOŚCI</h3>\n";
        $body .= "<ul>\n";
        $row = $result->fetch_array(MYSQLI_ASSOC);
        $body .= "<li><a href=\"#\">". $row['tekst'] ."</a></li>\n";
        $body .= "<li><a href=\"#\">Drugie</a></li>\n";
        $body .= "<li><a href=\"#\">Trzecie</a></li>\n";
        $body .= "</ul>\n";
    }

    echo $body;
?>

Widać, że pobrałem tylko jeden rząd i wstawiłem tylko jeden element, ale robiłem to tylko testowo, więc ogólnie cały skrypt nie jest mistrzostwem świata w semantycznym pisaniu i w ogóle nie ma większego sensu. Chodzi mi tylko o zrobienie tego samego, ale za pomocą bazy danych.

Chodzi mi tylko o jedno. Łączenie się do bazy z localhosta zajmuję prawdopodobnie koło sekundy, gdyż nowa zawartość pojawia się dopiero po około 1-1.5 sekundy. Gdy nie korzystam z bazy tylko z palca wpisuje dane, które mają się pojawić po kliknięciu przycisku, wszystko dzieje się bardzo szybko. I moje pytanie jest takie: Czy do tego typu rzeczy warto w ogóle zaprzegać bazę danych czy lepiej przechować to w jakiejś tablicy, zmiennej, itd. i pobrać, co będzie przy tak napisanym kodzie o wiele szybsze?

Czy może robię jakiś błąd, np. taki, że łącze się z bazą za każdym razem, kiedy klikam przycisk? Z server-sidem dopiero zaczynam, więc nie wiem jak "będzie lepiej" w takiej sytuacji. Może się da połączyć z bazą na starcie strony, a potem już tylko wywoływać zapytania? Albo na starcie połączyć się z bazą, wprowadzić dane do jakiejś tablicy i potem z niej korzystać w skrypcie?

Jestem ciekawy odpowiedzi, bo o ile różnego rodzaju rozwiązania zawsze znajduję na stack overflow albo w książkach, to tego typu rzeczy nie umiałem znaleźć.

1

Jeżeli w bazie będziesz te dane jakoś umieszczał sensownie - to warto je trzymać tam, bo pomoże Ci łatwo zarządzać treścią. W momencie jak wrzucasz dane przez jakiegoś phpMyAdmina (co zakładam zrobiłeś) to trochę to nie ma sensu :p

łączenie z bazą nie powinno zająć tyle czasu. ile masz tych newsów? masz indeks w tabeli? zmierz sobie dokładnie ile trwa wykonanie poszczególnych linii kodu (porównuj sobie dwie wartości z microtime(true) - przed i po wykonaniu operacji)

oraz czy na pewno łączysz się do lokalnej bazy a nie jakiejś zdalnej? (w przykładzie tak jest, ale nie wiem jak to konkretnie masz)

0

Wrzucałem przez phpMyAdmin, ale w zakładce SQL wpisywałem polecenia, nie lubię wyklikiwać tego, trwa dłużej i mam wrażenie, że phpMyAdmin wcale nie ma jakiegoś wygodnego interfejsu. W tabeli były może trzy/cztery newsy, więc to na pewno nie kwestia długotrwającego selecta. W ogóle na laboratoriach na studiach robiłem tabele w taki sam sposób i czasy wykonania zapytań były prawie niezauważalne. Struktura tabeli wygląda tak:
idn INT (który jest primary keyem), link CHAR(50), tekst CHAR(50).

Wrzuciłem to na mój serwer na hekko i wszystko wykonuje się bardzo szybko. Problemem było coś co z XAMPPem. Sorry za sianie problemu ;) Ale nie wiem co właściwie, pliki miałem w htdocs, łączyłem się normalnie raczej. No nie ważne, ważne, że działa na normalnym serwerze szybko.

Jeżeli w bazie będziesz te dane jakoś umieszczał sensownie

Miałeś na myśli kwestie indeksu, typów zmiennych, postaci normalnych czy coś jeszcze :)? Co do postaci normalnych, wyczytałem, że nie warto za bardzo bawić się w trzecią postać normalną, bo takie przesadne dzielenie wszystkiego na miliard tabel powoduje, że wydłuża się czas operacji bazodanowych. Na jednej ksiązce nie będę opierał wszystkiego, więc jestem ciekaw jak to jest w współczesnym database'owaniu :)

0

Chodzi o słówko "umieszczał". Bez sensu baza danych, jak chcesz do niej dane z palca klepać, co innego jakbyś miał jakiś nawet najprostszy panel do edycji tego.

O postaciach normalnych to nigdy nie czytałem, w programowaniu polegam po trochu na wiedzy przeczytanej, a trochę na własnym rozsądku (gdyż niektórzy piszą bzdury ;])

1 użytkowników online, w tym zalogowanych: 0, gości: 1