webForumDet fria alternativet

Listigt sätt att visa/hantera data...?

24 svar · 1 363 visningar · startad av learn · sida 2 av 2

learnMedlem sedan jan. 20051 130 inlägg
#21

Verkligen ingen som kan svara på det här??

effataMedlem sedan apr. 2008137 inlägg
#22

Ett knep som ni verkar ha missat är SQL_CALC_FOUND_ROWS.
Då slipper du en extra query.

Skriv helt enkelt SELECT SQL_CALC_FOUND_ROWS a, b, c din query som vanligt
Sen kör du SELECT FOUND_ROWS() as rows direkt efteråt. Då får du ut en siffra på hur många rader din query skulle innehållit om du inte använt limit.
Det är "rätt" sätt att få ut en siffra för paginering.

Vad gäller mellanlagring beror det lite på vad du har för hostinglösning. Har du egen server kan jag rekommendera memcached. Annars kan du förmodligen spara din data i en serialiserad array i en textfil. Detta om du vill ha en cachning som funkar globalt. Vill du bara cacha data för varje användare kan du använda session.

Jag skulle gjort cacheposter och gett dom namn efter en md5 av din sqlsats och sen lagrat dom på något sätt, memcached eller fil. På så sätt kan du lätt cacha varje query för sig, och komma åt dom snabbt.

learnMedlem sedan jan. 20051 130 inlägg
#23

effata skrev:

Ett knep som ni verkar ha missat är SQL_CALC_FOUND_ROWS.
Då slipper du en extra query.

Skriv helt enkelt SELECT SQL_CALC_FOUND_ROWS a, b, c din query som vanligt
Sen kör du SELECT FOUND_ROWS() as rows direkt efteråt. Då får du ut en siffra på hur många rader din query skulle innehållit om du inte använt limit.
Det är "rätt" sätt att få ut en siffra för paginering.

Vad gäller mellanlagring beror det lite på vad du har för hostinglösning. Har du egen server kan jag rekommendera memcached. Annars kan du förmodligen spara din data i en serialiserad array i en textfil. Detta om du vill ha en cachning som funkar globalt. Vill du bara cacha data för varje användare kan du använda session.

Jag skulle gjort cacheposter och gett dom namn efter en md5 av din sqlsats och sen lagrat dom på något sätt, memcached eller fil. På så sätt kan du lätt cacha varje query för sig, och komma åt dom snabbt.

Mycket intressant, tack effata!

Jag förstår dock inte helt och hållet hur jag ska göra. Kan du ge ett enkelt exempel på hur jag kan använda metoden i PHP...? Blir inte klokare av att läsa referensmanualen.

Tack på förhand!

effataMedlem sedan apr. 2008137 inlägg
#24

Först kör du din query precis som vanligt, men med SQL_CALC_FOUND_ROWS först.
$result = mysql_query("SELECT SQL_CALC_FOUND_ROWS * FROM users LIMIT 30");
Sen hämtar du bara FOUND_ROWS() direkt efter, så får du ut hur många rader queryin skulle gett utan limit.
$rowresult = mysql_query("SELECT FOUND_ROWS() as rows");

Eller var det cachningen du undrade över?
Jag skulle skött cachningen så här (pseudokod):

$sql = Din sql query
$hash = md5($sql);
if (cache item för $hash finns) {
  returnera från cache;
}
kör $sql query

Cachen kan t.ex. vara en fil som heter $hash.cache, eller en memcachepost $hash, eller en rad i en array[$hash].

learnMedlem sedan jan. 20051 130 inlägg
#25

Tack för tipset, grym funktion!! God jul påre' :bire :bire

133 ms totalt · 3 externa anrop · v20260731065814-full.fb544a5a
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)