L

MySQLi/MySQL és a PHP 5.5

A legutolsó upgrade alkalmával frissült az Apache és a PHP is a gépemen. Kubuntut használok, így jelenleg a 13.10-es került a gépre. Épp egy régi project javításán dolgoztam, mikor megtörtént a frissítés, felkerült a PHP 5.5

Régebben olvastam, hogy ki fog kerülni a mysql a PHP-ból, de ezt az információt valahogy teljesen félretettem. Most mikor felfrissítettem a rendszert, visszaállítgattam a virtuális hostokat, és beállítottam az apache-ot, folytatni akartam a munkát. Egy baromi aranyos üzenet várt a hibakezelőmben:

Unknown error type: [8192] mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead
Error on line 14 in file /home/leoamros/public_html/xy_domain.hu/engine/core.php

"Hupsz. Ez meg mi?" Felkiáltás előtt még végig futott az agyamban, hogy minden jól lett-e beállítva. Persze, hisz ez már ilyenkor rutin feladat. Újra olvasva a hibaüzenetet, beugrott a régebbi cikk, hogy ki fog kerülni a mysql, helyette a mysqli vagy a PDO lesz.

InnoDB vs. MyISAM

MyISAM vagy InnoDB? Felmerült-e már valakiben a kérdés, hogy melyiket, mire és hogyan használja?Bennem igen :) emiatt kicsit utána is lestem hogy mi is az alapvető különbség, melyiket preferálják és melyiket ajánlják tárhelyszolgáltatók vagy akár külföldi fejlesztők.

Tehát okosodjunk:

MySQL RAND()

Elég sokszor van, hogy egy webshopnál, vagy weblapnál random sorokat kell lekérdezni adatbázisból. Addig nincs gond, míg pár száz vagy néhány ezer sorból kell válogatni. De mi van, ha több százezer sorból válogatunk? Ilyenkor már elég komolyan be tud lassulni a MySQL.

A legkönnyebb módszer random sorok lekérdezésére MySQL-ben az ORDER BY RAND().

SELECT col1 FROM tbl ORDER BY RAND() LIMIT 100;

Kis tábláknál nagyon jól működik, de nagyobb tábláknál már jelentős teljesítmény gondok lépetnek fel. Ez annak köszönhető, hogy a MySQL először minden sorhoz egy random számot generál, majd ezeket sorba rendezi.

Tehát, ha csak 10 random sort akarsz olvasni egy adatbázisból, melyben 100e sor van, a MySQL-nek a 100e sort először rendeznie kell, majd kiválaszt belőle 10-et.

Találtam egy megoldást, ami szerint a RAND a lekérdezés WHERE részében helyezkedik el és nem az ORDER BY-ban. Először is kell egy tört szám, ami össz sor számából és a limitből jön ki. Aztán pedig ezt használjuk a lekérdezés WHERE részében.

Leoamros

X

Üdv! Ha még személyesen nem ismerjük egymást, Smajda László vagyok, de szólíts csak egyszerűen Laccának vagy Leoamrosnak. Olyan netbúvároknak osztom az észt, akik szárnyaikat próbálgatják a PHP, MySQL, JavaScript világában, és elakadnak valamelyik folyamat során. Főleg a saját tapasztalatokat írom le, ettől függetlenül kérdezhetsz bátran, lehetőségeimhez mérten válaszolok.

Kategóriák
Címkék
Social Media
Eszközök