FAQ |
Kalender |
![]() |
#1 | ||
|
|||
Medlem
|
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; Kod:
id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE users index NULL PRIMARY 4 NULL 1938 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; mvh Senast redigerad av zilveer den 2010-04-18 klockan 21:45 |
||
![]() |
![]() |
![]() |
#2 | |||
|
||||
Klarade millennium-buggen
|
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? |
|||
![]() |
![]() |
![]() |
#3 | ||
|
|||
Medlem
|
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? |
||
![]() |
![]() |
![]() |
#4 | ||
|
|||
Flitig postare
|
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. |
||
![]() |
![]() |
![]() |
#5 | ||
|
|||
Klarade millennium-buggen
|
Ä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? |
||
![]() |
![]() |
![]() |
#6 | ||
|
|||
Medlem
|
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? |
||
![]() |
![]() |
![]() |
#7 | ||
|
|||
Medlem
|
Citat:
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 Kod:
id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE users ALL NULL NULL NULL NULL 2134 |
||
![]() |
![]() |
![]() |
#8 | |||
|
||||
Klarade millennium-buggen
|
För att räkna alla rader kan du ju köra
Kod:
SELECT count(*) FROM users; Kod:
SELECT * FROM users ORDER BY id DESC LIMIT 0,50; Kod:
SELECT * FROM users ORDER BY id DESC LIMIT 50,50; Kod:
SELECT * FROM users ORDER BY id DESC LIMIT 100,50; |
|||
![]() |
![]() |
![]() |
#9 | ||
|
|||
Supermoderator
|
Citat:
__________________
Full-stack developer, free for smaller assignments |
||
![]() |
![]() |
![]() |
#10 | ||
|
|||
Administratör
|
Citat:
|
||
![]() |
![]() |
Svara |
|
|