===========================
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.
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.
nu o sa ii mearga index pe id,categorie,subategorie pt ca id este setat primary.
Fa doar pt categorie,subcategorie
Cum sa nu mearga? Merge, ia testeaza![]()
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
* 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.
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...
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![]()
blog Daniel Buca
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.
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.
Momentan este/sunt 1 utilizator(i) care navighează în acest subiect. (0 membrii și 1 vizitatori)