Kom ihåg mig?
Home Menu

Menu


problem med Mysql Slow query

 
Ämnesverktyg Visningsalternativ
Oläst 2010-04-18, 21:09 #1
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
Standard problem med Mysql Slow query

Hejsan allihopa,
jag har ett "litet" problem men som påverkar hela databasen pga det lilla problemet så påverkas hela servern och blir seg pga alla mysql slow queries.

SQL raden som anropas ser ur på följande vis:
Kod:
SELECT * FROM users ORDER BY id DESC;
Detta anrop skapar problem för mig, kör jag explain på den så får jag fram följande data:


Kod:
id 	select_type 	table 	type 	possible_keys 	key 	key_len 	ref 	rows 	Extra
1 	SIMPLE 	users 	index 	NULL 	PRIMARY 	4 	NULL 	1938
Denna logg sparas i mysql_slow_quries filen. Förstår dock inte, det är en InnoDB databas.

Raden ser ut som följande i mysql slow queries filen:
Kod:
# Time: 100418 15:27:51
# Query_time: 2  Lock_time: 0  Rows_sent: 1801  Rows_examined: 1801
SELECT * FROM users ORDER BY id DESC;
Vad kan detta bero på? Tacksam för all hjälp och vägledning.
mvh

Senast redigerad av zilveer den 2010-04-18 klockan 21:45
zilveer är inte uppkopplad   Svara med citatSvara med citat
Oläst 2010-04-18, 21:15 #2
fabians avatar
fabian fabian är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Jul 2004
Inlägg: 2 162
fabian fabian är inte uppkopplad
Klarade millennium-buggen
fabians avatar
 
Reg.datum: Jul 2004
Inlägg: 2 162
Har du index på id?

Är du säker på att du måste köra igenom alla 1801 rader? Skall du verkligen använda alla, eller funkar det kanske lika bra med en limit på 50?
fabian är inte uppkopplad   Svara med citatSvara med citat
Oläst 2010-04-18, 21:22 #3
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
fabian:
tack för snabb svar.. glömde skriva att id är PRIMARY. Och anledningen till att jag vill ha ut alla är att jag ska köra paging på det. Hur kommer det sig att kolumnen possible_keys samt ref är NULL när jag kör explain på anropet?
zilveer är inte uppkopplad   Svara med citatSvara med citat
Oläst 2010-04-18, 21:35 #4
Weaver Weaver är inte uppkopplad
Flitig postare
 
Reg.datum: Aug 2006
Inlägg: 403
Weaver Weaver är inte uppkopplad
Flitig postare
 
Reg.datum: Aug 2006
Inlägg: 403
Nu vet jag inte hur hela din tabell ser ut men... Anledningen till att possible_keys är NULL kan vara för att MySQL anser det vara snabbare att läsa direkt från tabellen istället för att använda sig av index.

Om du skall implementera paging bör du använda LIMIT (offset, antal) i din query som fabian rådde dig till. Du skall inte dela upp resultatet i PHP eller ASP.

Tänk också på att bara begära data som du behöver. * är sällan optimalt.
Weaver är inte uppkopplad   Svara med citatSvara med citat
Oläst 2010-04-18, 21:38 #5
Magnus_A Magnus_A är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: May 2006
Inlägg: 2 604
Magnus_A Magnus_A är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: May 2006
Inlägg: 2 604
Även om du kör paging behöver du väl inte hämta alla.
Det räcker väl med totalantalet och den aktuella sidan?

Tror inte mysql använder index när du hämtar alla, finns inget att selektera på.

Hur uppför sig frågan utan order by och med ORDER BY NULL?
Magnus_A är inte uppkopplad   Svara med citatSvara med citat
Oläst 2010-04-18, 21:41 #6
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
Weaver: tack för svar

Saken är den att jag använder ett paging script där jag först måste räkna ut antalet rader.. den i sin tur tar mysql raden och sätter en limit på den.

tabellen har lite information om användare, som t.ex. namn, mail, datum samt lite till info.

men om mysql anser att det går snabbare att läsa så hela tabellen istället för att använda index förstår jag inte för som det ser ut nu så körs denna mysql anrop varje gång någon laddar sidan. har man 10 000 besökare så blir det ju 10 000 slow queries..

Ingen som kan hjälpa mig med att lösa detta?
zilveer är inte uppkopplad   Svara med citatSvara med citat
Oläst 2010-04-18, 21:44 #7
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
Citat:
Ursprungligen postat av Magnus_A Visa inlägg
Även om du kör paging behöver du väl inte hämta alla.
Det räcker väl med totalantalet och den aktuella sidan?

Tror inte mysql använder index när du hämtar alla, finns inget att selektera på.

Hur uppför sig frågan utan order by och med ORDER BY NULL?

EXPLAIN SELECT * FROM users
Kod:
id 	select_type 	table 	type 	possible_keys 	key 	key_len 	ref 	rows 	Extra
1 	SIMPLE 	users 	ALL 	NULL 	NULL 	NULL 	NULL 	1634
ORDER BY NULL
Kod:
id 	select_type 	table 	type 	possible_keys 	key 	key_len 	ref 	rows 	Extra
1 	SIMPLE 	users 	ALL 	NULL 	NULL 	NULL 	NULL 	2134
zilveer är inte uppkopplad   Svara med citatSvara med citat
Oläst 2010-04-18, 22:01 #8
fabians avatar
fabian fabian är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Jul 2004
Inlägg: 2 162
fabian fabian är inte uppkopplad
Klarade millennium-buggen
fabians avatar
 
Reg.datum: Jul 2004
Inlägg: 2 162
För att räkna alla rader kan du ju köra

Kod:
SELECT count(*) FROM users;
Sedan kör du på sida 1
Kod:
SELECT * FROM users ORDER BY id DESC LIMIT 0,50;
På sida 2
Kod:
SELECT * FROM users ORDER BY id DESC LIMIT 50,50;
På sida 3
Kod:
SELECT * FROM users ORDER BY id DESC LIMIT 100,50;
Eller är det något jag missar?
fabian är inte uppkopplad   Svara med citatSvara med citat
Oläst 2010-04-18, 22:02 #9
tartareandesire tartareandesire är inte uppkopplad
Supermoderator
 
Reg.datum: Jan 2004
Inlägg: 11 585
tartareandesire tartareandesire är inte uppkopplad
Supermoderator
 
Reg.datum: Jan 2004
Inlägg: 11 585
Citat:
Ursprungligen postat av zilveer Visa inlägg
Weaver: tack för svar

Saken är den att jag använder ett paging script där jag först måste räkna ut antalet rader.. den i sin tur tar mysql raden och sätter en limit på den.

tabellen har lite information om användare, som t.ex. namn, mail, datum samt lite till info.

men om mysql anser att det går snabbare att läsa så hela tabellen istället för att använda index förstår jag inte för som det ser ut nu så körs denna mysql anrop varje gång någon laddar sidan. har man 10 000 besökare så blir det ju 10 000 slow queries..

Ingen som kan hjälpa mig med att lösa detta?
Är det segt även med COUNT? Du bör som sagt var inte läsa hela tabellen bara för att räkna rader.
__________________
Full-stack developer, free for smaller assignments
tartareandesire är inte uppkopplad   Svara med citatSvara med citat
Oläst 2010-04-18, 22:04 #10
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 zilveer Visa inlägg
men om mysql anser att det går snabbare att läsa så hela tabellen istället för att använda index förstår jag inte för som det ser ut nu så körs denna mysql anrop varje gång någon laddar sidan. har man 10 000 besökare så blir det ju 10 000 slow queries..

Ingen som kan hjälpa mig med att lösa detta?
Du har redan fått svaret. Du bör inte hämta alla rader. Du bör använda LIMIT. Sidindelning görs med enkelt genom att hämta totala antalet rader från databasen. Dock bör du inte köra en generisk COUNT för varje besökare mot en innodb-tabell utan spara undan antalet rader i speciell tabell/rad/fil - vid insert eller jämna mellanrum beroende på mängd inserts. Detta då innodb bara har en ungefärlig rowcount cachad.
Clarence ä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 04:27.

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