Kom ihåg mig?
Home Menu

Menu


problem med Mysql Slow query

 
Ämnesverktyg Visningsalternativ
Oläst 2010-04-18, 22:11 #11
zilveer zilveer är inte uppkopplad
Medlem
 
Reg.datum: Jun 2006
Inlägg: 128
zilveer zilveer är inte uppkopplad
Medlem
 
Reg.datum: Jun 2006
Inlägg: 128
Saken är den att jag använder paging scriptet som finns på följande länk:
http://net.tutsplus.com/tutorials/ph...data-with-php/

nu verkar det som att den inte går att använda..

Clarence
kan ej spara antalet rader i en fil/tabell då jag även har sökkriterier på sidan.. kanske blir enklast att bara köra med anrop:

count()...sök kriterier..

sen så kör jag samma anrop med:

sökkriterier.. order by ?
zilveer är inte uppkopplad   Svara med citatSvara med citat
Oläst 2010-04-18, 22:29 #12
Lindahl Lindahl är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Dec 2004
Inlägg: 854
Lindahl Lindahl är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Dec 2004
Inlägg: 854
Kolla lite på SQL_CALC_FOUND_ROWS. Då kan du få fram totala antalet rader även om du använder LIMIT.
Lindahl är inte uppkopplad   Svara med citatSvara med citat
Oläst 2010-04-18, 22:47 #13
zilveer zilveer är inte uppkopplad
Medlem
 
Reg.datum: Jun 2006
Inlägg: 128
zilveer zilveer är inte uppkopplad
Medlem
 
Reg.datum: Jun 2006
Inlägg: 128
Tack för svar allihopa..

Jag har kommit fram till följande:

I och med att sidan kommer att visas beroende på sökkriterier och jag använder paging och behöver limit på detta så är den smidigaste lösningen

att t.ex. få följande mysql anrop rad

observera att detta bara är ett exempel på anrop, den är inkorrekt men vill bara visa hur jag skulle vilja ha det.

Kod:
SELECT * FROM users t LEFT JOIN guestbook g ON g.uid=t.i WHERE bla bla bla GROUP BY bla bla ORDER BY id DESC LIMIT 0,25

till denna rad:

SELECT COUNT(*) FROM users t LEFT JOIN guestbook g ON g.uid=t.i WHERE bla bla bla
med andra ord vill jag ersätta allt som finns mellan SELECT och FROM med COUNT(*) samt att jag vill få bort group by, order by samt limit..

Om jag inte har fel så kan man fixa detta med reguljära uttryck, är bara n00b på detta.. har kommit så här långt:

Kod:
	$search_sql = "SELECT * FROM users t LEFT JOIN guestbook g ON g.uid=t.i WHERE bla bla bla GROUP BY bla bla ORDER BY id DESC LIMIT 0,25";
	$reg_expr = '/SELECT * FROM$/';
	
	$rep_with = ' COUNT(*) ';
	$count_sql = preg_replace($reg_expr, $rep_with, $search_sql);
någon som har en lösning?
zilveer är inte uppkopplad   Svara med citatSvara med citat
Oläst 2010-04-18, 23:33 #14
taz76 taz76 är inte uppkopplad
Flitig postare
 
Reg.datum: Jan 2008
Inlägg: 388
taz76 taz76 är inte uppkopplad
Flitig postare
 
Reg.datum: Jan 2008
Inlägg: 388
varför krångla till det med ett regex? om du vet tabellens namn så ser jag ingen anledning att krångla med regex.
taz76 är inte uppkopplad   Svara med citatSvara med citat
Oläst 2010-04-19, 11:03 #15
Jonas Jonas är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Feb 2004
Inlägg: 3 364
Jonas Jonas är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Feb 2004
Inlägg: 3 364
SQL " ORDER BY " åsidosätter användning av INDEX.

Därför kommer frågan att klassas som SLOW QUERY när du använder det.

Fabians " SELECT count(<fältnamn>) ..." är ett bättre alternativ eftersom den kommer att använda INDEX.
Jonas är inte uppkopplad   Svara med citatSvara med citat
Oläst 2010-04-19, 22:06 #16
Clarence Clarence är inte uppkopplad
Administratör
 
Reg.datum: Jan 2003
Inlägg: 1 974
Clarence Clarence är inte uppkopplad
Administratör
 
Reg.datum: Jan 2003
Inlägg: 1 974
Citat:
Ursprungligen postat av Jonas Visa inlägg
SQL " ORDER BY " åsidosätter användning av INDEX.

Därför kommer frågan att klassas som SLOW QUERY när du använder det.

Fabians " SELECT count(<fältnamn>) ..." är ett bättre alternativ eftersom den kommer att använda INDEX.
Nej, det beror på WHERE-satsen, joins, sorteringsordningen (ASC/DESC) osv. Endast ett index används, men kan användas för både sortering och villkor. Se http://dev.mysql.com/doc/refman/5.0/...imization.html för detaljer för första biten.

En liten detalj är också att COUNT(fältnamn) räknar icke-null värden på fältet. COUNT(*) däremot räknar antalet rader.

Dock bör man om man använder innodb använda räknare så långt som möjligt - med ett gäng miljoner rader kan en COUNT(*) lätt ta flera minuter (och i bästa fall hamna i query cache en liten liten stund innan en ny insert görs). Eftersom frågan verkar kunna ställas utan WHERE-sats bör man ha en räknare för antalet rader. Sen åsidosätter man den med en COUNT(*) för ovanliga queries (ofta allt utom just den utan villkor).
Clarence är inte uppkopplad   Svara med citatSvara med citat
Oläst 2010-04-20, 23:30 #17
zilveer zilveer är inte uppkopplad
Medlem
 
Reg.datum: Jun 2006
Inlägg: 128
zilveer zilveer är inte uppkopplad
Medlem
 
Reg.datum: Jun 2006
Inlägg: 128
Hej och tack för alla svar.. Nu har jag åtgärdat problemet med en COUNT(*), sen så kör jag med en vanlig SELECT-sats för att hämta ut data från mysql.

Nu har jag dock ett annat litet mindre problem med mysql slow queries.
Följande rad hamnar i mysql slow queries filen, här kan man ju inte köra en explain så jag förstår inte riktigt varför det blir så.

Kod:
UPDATE apps SET downloads = downloads+1 WHERE id = "ettid" ;
Jag har satt ID som en primär nyckel, förstår inte att det kan hamna under mysql slow queries? Någon som har tips på vad detta kan bero på?
zilveer är inte uppkopplad   Svara med citatSvara med citat
Oläst 2010-04-20, 23:30 #18
zilveer zilveer är inte uppkopplad
Medlem
 
Reg.datum: Jun 2006
Inlägg: 128
zilveer zilveer är inte uppkopplad
Medlem
 
Reg.datum: Jun 2006
Inlägg: 128
Hej och tack för alla svar.. Nu har jag åtgärdat problemet med en COUNT(*), sen så kör jag med en vanlig SELECT-sats för att hämta ut data från mysql.

Nu har jag dock ett annat litet mindre problem med mysql slow queries.
Följande rad hamnar i mysql slow queries filen, här kan man ju inte köra en explain så jag förstår inte riktigt varför det blir så.

Kod:
UPDATE apps SET downloads = downloads+1 WHERE id = "ettid" ;
Jag har satt ID som en primär nyckel, förstår inte att det kan hamna under mysql slow queries? Någon som har tips på vad detta kan bero på?
zilveer är inte uppkopplad   Svara med citatSvara med citat
Oläst 2010-04-20, 23:48 #19
gooses avatar
goose goose är inte uppkopplad
Flitig postare
 
Reg.datum: Jun 2007
Inlägg: 451
goose goose är inte uppkopplad
Flitig postare
gooses avatar
 
Reg.datum: Jun 2007
Inlägg: 451
är id en sträng, eller bara ett konstigt exempel (syftar på "ettid") ?
goose är inte uppkopplad   Svara med citatSvara med citat
Oläst 2010-04-21, 08:55 #20
wdb wdb är inte uppkopplad
Nykomling
 
Reg.datum: Feb 2010
Inlägg: 28
wdb wdb är inte uppkopplad
Nykomling
 
Reg.datum: Feb 2010
Inlägg: 28
Citat:
Ursprungligen postat av Jonas Visa inlägg
SQL " ORDER BY " åsidosätter användning av INDEX.

Därför kommer frågan att klassas som SLOW QUERY när du använder det.

Fabians " SELECT count(<fältnamn>) ..." är ett bättre alternativ eftersom den kommer att använda INDEX.
Grattis, 3 av 3 fel. Folk som bara gissar borde verkligen inte uttala sig.

zilveer, det blir enklare att se vad som är fel om du postar en DESCRIBE på tabellen så att vi ser att du faktiskt har id som primary key och inte förvirrat till det för dig själv.
wdb är inte uppkopplad   Svara med citatSvara med citat
Svara


Aktiva användare som för närvarande tittar på det här ämnet: 1 (0 medlemmar och 1 gäster)
 

Regler för att posta
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är
HTML-kod är av

Forumhopp


Alla tider är GMT +2. Klockan är nu 09:35.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson
 
Copyright © 2017