Este adevarat doar ca eu am id, user, pass si vizite … nu sunt asa multe chestii, am pus si “id, utilizator” inloc de “*” dar tot la fel de greu interogheaza.
try{
$pdo = new PDO("mysql:host=$db_host;dbname=$db_name;charset=$charset",$db_user,$db_pass,
array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'"));
} catch(PDOException $e){
die("Nu se poate face conexiunea la baza de date !");
}
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);
Pune în select doar coloanele de care ai nevoie, chiar dacă sunt multe.
1.1 Indecși pe tabelă (pe coloanele după care faci căutări des dar și pe coloanele după care faci order?
Citește datele folosind while, ca să nu ramai fără memorie (elimini $result, care practic ține toate datele): while ($row = $query->fetch(PDO::FETCH_ASSOC)) { /* magic */ }
$result = $pdo->query("SELECT id,utilizator FROM users ORDER BY vizite DESC LIMIT 0,20");
foreach ($result as $row) {
$uid = $row['id'];
$user = $row['utilizator'];
echo $uid." - ".$user."<br/>\n";
}
Dar nu imi pare sa interogheze mai rapid, tot cu greu.
Asa cu spunea si @redecs, pune index pe coloanele pe care le folosesti in WHERE sau ORDER BY pentru optimizarea query-urilor (in cazul tau adauga un indexINDEX pe coloana vizite). Vezi aici cum/cand foloseste MySQL indecsii si aici pentru a vedea cum pot fi optimizate query-urile care folosesc ORDER BY.
Daca timpul nu se imbunatateste poate exista o problema cu serverul / baza de date…
Nu ai ce optimiza la query în acest caz dacă ai deja index pe id, probabil baza ta de date rulează pe un server cu I/O slab, fără indecșii în memorie sau o versiune de MySQL veche.
Dacă rulezi pur și simplu select-ul în phpmyadmin sau navicat/heidisql/dbeaver ar trebui să meargă aproape instant.
Da, poate pune un index care va fi folosit în acest caz pentru a rula mai rapid, dar nu poate optimiza query-ul în sine.
Sortarea pe niște valori numerice nu trebuie să îi facă probleme mysql-ului la 1 milion de utilizatori, adică vei vedea rezultatul sub 1s. Nu va rula mai rapid în phpmyadmin, va rula rapid orice i-ai face că doar e vorba de un quick sort amărât.
Te conectezi cumva pe dns în loc de ip la serverul mysql ? Folosește direct socket-ul sau 127.0.0.1 dacă e pe același server. În php cel mai rapid mod de interogare este PDO dacă rețeaua la serverul mysql e un bottleneck, altfel e egal cu mysqli.
Salut,
Daca tot ai nevoie de optimizare suplimentara atunci poti pastra in tabela doar elementele esentiale si restul intr-o tabela secundara.
Astfel in tabela de 1 mil faci query pe 2 coloane si dupa faci query in tabela secundara. .