Pagina 2 din 3 PrimulPrimul 123 UltimulUltimul
Rezultate 11 la 20 din 22

Subiect: Random from sql: cum sa il fac sa se incarce mai repede

  1. #11
    Avatarul lui evolution
    evolution este deconectat Membru SeoPedia
    Reputatie:
    39
    Data înscrierii
    29th October 2006
    Locaţie
    Bucuresti
    Posturi
    997
    Putere Rep
    39


    Implicit

    Citat Postat în original de loco Vezi Post
    Asta nu putea fi scrisa ca
    SELECT * FROM produse AS a JOIN ( SELECT CEIL(RAND( )*( SELECT id FROM produse ORDER BY id DESC LIMIT 1 )) AS id) AS b WHERE a.id >= b.id and categorie='$categorie' and subcategorie='$subcategorie' LIMIT 15
    ?
    Se pare ca CEIL face sa se afiseze id-urile corect in url rescris .
    Dupa ce termin va anunt cu cat s-a imbunatatit viteza.

    Thank you my friends!

  2. #12
    Avatarul lui deadworldisee
    deadworldisee este deconectat Membru SeoPedia
    Reputatie:
    35
    Data înscrierii
    6th April 2008
    Locaţie
    iasi
    Vârstă
    38
    Posturi
    1.034
    Putere Rep
    35


    Implicit

    Citat Postat în original de loco Vezi Post
    Sa zicem ca ultimul id (adica MAX(ID)) este 250.
    RAND() * 250 da numar cu virgula, daca RAND() < 1.
    Folosim CEIL pentru a rotunji numarul si a sacapa de ,

    Asta nu putea fi scrisa ca
    SELECT * FROM produse AS a JOIN ( SELECT CEIL(RAND( )*( SELECT id FROM produse ORDER BY id DESC LIMIT 1 )) AS id) AS b WHERE a.id >= b.id and categorie='$categorie' and subcategorie='$subcategorie' LIMIT 15
    ?

    Adica de ce MAX(id) din moment ce este index pe id?

    Si varchar este poate avea maxim 255 caractere. de ce recomanzi char(255)? Spatiu risipit aiurea daca nu se folosesc toate caracterele.

    Iar functia asta ia doar id-ul random (b.id) dupa care returneaza rezultatele comparate cu acel id (afiseaza produsele cu id mai mare sau egal decat id-ul random in limita a 15. de exemplu, daca sunt 3 ce respecta conditia asta, doar 3)
    ===========================
    MAX(id) este maximul idului din tot tabelul ,nu inteleg ce treaba are index de id.


    Daca folosesti CEIL faci o comanda in plus pentru ca la WHERE a.id >= b.id idurile sunt intregi si nu e nevoie sa il rotunjesti ca tot acelasi rezultat da.

    Varchar nu are max 255 de caractere !!!! In functie de ce versiune de mysql ai.
    Toate versiunile mai mici de 5.03 aveau 255 caractere,versiunile noi pot avea max 65,535 caractere.

    diferenta dintre char si varchar e ca varchar foloseste 1 bit in plus,dar este mult mai eficient decat text cand depaseste 255 de caractere un row.


    Da, interogare respectiva returneaza campurile mai mari de b.id insa b.id este random.

    Daca ai doar 3 rowuri ai 1/3 sanse sa iti afiseze 3 rowuri pt limit 3.

    Daca stii tu o interogare mai eficienta decat asta te rog arata-ne.Orice pont e bun in baze de date.

  3. #13
    Avatarul lui loco
    loco este deconectat Membru SeoPedia
    Reputatie:
    33
    Data înscrierii
    6th February 2008
    Posturi
    145
    Putere Rep
    33


    Implicit

    Umm da.. dar lui ii returna cu virgula (punct, ma rog) si acum am observat de ce. Deoarece random id are acelasi nume ca si coloana id.

    So, si mai bine:
    SELECT * FROM produse AS a JOIN ( SELECT RAND()*( SELECT MAX(id) FROM produse ) AS rid) AS b WHERE a.id >= b.rid and categorie='$categorie' and subcategorie='$subcategorie' LIMIT 15

    Incearca cu acest query evolution.

    Incearca sa faci si un composite index. Adica pui un index pe 3 coloane: id, categorie, subcategorie (in ordinea asta)

    In legatura cu MAX(id).. credeam ca SELECT id FROM produse ORDER BY id DESC LIMIT 1 e mai rapid decat SELECT MAX(id) FROM produse.. Dar se pare ca m-am inselat. Sunt la fel (0.0001 sec pt 376243 inregistrari)
    Ultima modificare făcută de loco; 4th August 2008 la 01:22.

  4. #14
    Avatarul lui deadworldisee
    deadworldisee este deconectat Membru SeoPedia
    Reputatie:
    35
    Data înscrierii
    6th April 2008
    Locaţie
    iasi
    Vârstă
    38
    Posturi
    1.034
    Putere Rep
    35


    Implicit

    nu o sa ii mearga index pe id,categorie,subategorie pt ca id este setat primary.

    Fa doar pt categorie,subcategorie

  5. #15
    Avatarul lui loco
    loco este deconectat Membru SeoPedia
    Reputatie:
    33
    Data înscrierii
    6th February 2008
    Posturi
    145
    Putere Rep
    33


    Implicit

    Cum sa nu mearga? Merge, ia testeaza

  6. #16
    Avatarul lui deadworldisee
    deadworldisee este deconectat Membru SeoPedia
    Reputatie:
    35
    Data înscrierii
    6th April 2008
    Locaţie
    iasi
    Vârstă
    38
    Posturi
    1.034
    Putere Rep
    35


    Implicit

    o sa iti arate un warning jos in structure .Poate tehnic a mers si nu a dat eroare dar ca eficienta nu castigi nimic in plus

  7. #17
    Avatarul lui evolution
    evolution este deconectat Membru SeoPedia
    Reputatie:
    39
    Data înscrierii
    29th October 2006
    Locaţie
    Bucuresti
    Posturi
    997
    Putere Rep
    39


    Implicit

    * loco, daca coloana cu iduri se cheama gigel, cum arata codul (nu inteleg ce e fix si ce e personalizat pt ce am eu in sql)?

    Functia JOIN se poate folosi si pentru altfel de selectii care ordoneaza rezultatele dupa un camp anume , ca sa maresc performanta de incarcare a paginii?
    $sql = "select * from produse ORDER BY doc_id DESC LIMIT 20";

    Pentru count (arata la fiecare subcategorie numarul total de produse ce se gasesc acolo) este vreo alternativa pt a mari viteza ?
    $sql2 = "SELECT COUNT(*) AS numrows from produse WHERE (subcategorie ='$nume_subcategorie')";
    Ultima modificare făcută de evolution; 4th August 2008 la 10:56.

  8. #18
    Avatarul lui deadworldisee
    deadworldisee este deconectat Membru SeoPedia
    Reputatie:
    35
    Data înscrierii
    6th April 2008
    Locaţie
    iasi
    Vârstă
    38
    Posturi
    1.034
    Putere Rep
    35


    Implicit

    Daca tot insisti pe super performanta fa tabele cu doar 2 fielduri in care un field sa fie keyword si fa selecturi doar pe joinuri.Evident iti umpli baza de date de tabele dar nu o sa mai ai probleme cu server load...

  9. #19
    Avatarul lui danielbuca
    danielbuca este deconectat Ambasador
    Reputatie:
    39
    Data înscrierii
    13th August 2006
    Locaţie
    Bucharest
    Vârstă
    47
    Posturi
    431
    Putere Rep
    39


    Implicit

    Daca discutati pur teoretic sa stiti ca normalizarea bazei de date la maxim nu mai e o solutie la cerintele aplicatiilor web de azi. Incercati database sharding

  10. #20
    Avatarul lui loco
    loco este deconectat Membru SeoPedia
    Reputatie:
    33
    Data înscrierii
    6th February 2008
    Posturi
    145
    Putere Rep
    33


    Implicit

    danielbuca multumesc, am sa ma documentez mai incolo despre acest termen
    Si oricum ajuta si normalizarea bazei de date, se simte cand o baza de date nu are indecsi sau/si e gandita prost.

    Citat Postat în original de evolution Vezi Post
    * loco, daca coloana cu iduri se cheama gigel, cum arata codul (nu inteleg ce e fix si ce e personalizat pt ce am eu in sql)?

    Functia JOIN se poate folosi si pentru altfel de selectii care ordoneaza rezultatele dupa un camp anume , ca sa maresc performanta de incarcare a paginii?
    $sql = "select * from produse ORDER BY doc_id DESC LIMIT 20";

    Pentru count (arata la fiecare subcategorie numarul total de produse ce se gasesc acolo) este vreo alternativa pt a mari viteza ?
    $sql2 = "SELECT COUNT(*) AS numrows from produse WHERE (subcategorie ='$nume_subcategorie')";
    1. SELECT * FROM produse AS a JOIN ( SELECT RAND()*( SELECT MAX(id) FROM produse ) AS rid) AS b WHERE a.gigel >= b.rid and categorie='$categorie' and subcategorie='$subcategorie' LIMIT 15
    Trebuie sa intelegi un query cat de cat..
    Sa-mi spui daca a functionat

    2. e foarte important sa-ti indexezi corect coloanele.. in acest caz sa ai index pe doc_id.
    Daca era "select * from produse WHERE id = 10 ORDER BY doc_id DESC LIMIT 20" indexul trebuia sa fie composite (adica un index multi-coloane) pe doc_id, id (in ordinea asta)

    3. Nu e bine gandita treaba cu count-ul. Eu personal as adauga in tabelul cu subcategorii o coloana in care sa-mi tin numarul de produse. Un unsigned SMALLINT de 5 sa zicem (daca nu depasesti 65535 produse/subcategorie).

    E simplu si eficient

    Un mic exemplu: Se adauga un produs si se alege subcategoria "test" (care are id-ul 10). Pe langa query-ul de "INSERT INTO produse ...." mai punem un query "UPDATE subcategorii SET count = count+1 WHERE subcategorie_id = 10".

    Iar cand vrei sa vezi cate produse ai la o subcategorie:
    SELECT count AS numrows FROM subcategorii WHERE subcategorie_id = '$produs_subcategorie_id'

    $produs_subcategorie_id reprezinta id-ul subcategoriei din care face parte produsul respectiv.

    Daca vrei sa afiseze fiecare subcategorie si numarul total de produse pentru fiecare subcategorie
    $query = mysql_query("SELECT * FROM subcategorii ");
    while ($row = mysql_fetch_array($query)) {
    echo $row['subcategorie_nume'].' ('.$row['count'].' )<br/>';
    }

    Alea le-am pus fictiv acolo.. mai departe te descurci tu.

    Important: in acel query am vazut "$nume_subcategorie", niciodata nu fa legatura intre tabele pe varchar/text sau mai stiu eu ce.. foloseste INT (si variante de int) si coloanele de legatura sa fie de acelasi tip si lungime.

    http://dev.mysql.com/doc/refman/5.0/...ric-types.html

    later edit: corectari
    Ultima modificare făcută de loco; 4th August 2008 la 16:06.

Pagina 2 din 3 PrimulPrimul 123 UltimulUltimul

Informații subiect

Utilizatori care navighează în acest subiect

Momentan este/sunt 1 utilizator(i) care navighează în acest subiect. (0 membrii și 1 vizitatori)

Thread-uri Similare

  1. Cumpar link-uri - plata foarte repede prin PayPal
    De Mihai Gianu în forumul Link-uri/Bannere
    Răspunsuri: 0
    Ultimul Post: 1st June 2009, 15:00
  2. random links
    De Mascka în forumul Discutii generale privind optimizarea si motoarele de cautare
    Răspunsuri: 0
    Ultimul Post: 22nd July 2007, 15:38
  3. Ia-l Repede Cat Mai E Pe Stoc
    De Cristian Mezei în forumul Bar, lobby...
    Răspunsuri: 8
    Ultimul Post: 26th May 2006, 10:54

Permisiuni postare

  • Nu puteţi posta subiecte noi.
  • Nu puteţi răspunde la subiecte
  • Nu puteţi adăuga ataşamente
  • Nu puteţi modifica posturile proprii
  •