Kom ihåg mig?
Home Menu

Menu


mySQL optimering

 
Ämnesverktyg Visningsalternativ
Oläst 2003-11-24, 19:29 #1
danjel danjel är inte uppkopplad
Medlem
 
Reg.datum: Nov 2003
Inlägg: 214
danjel danjel är inte uppkopplad
Medlem
 
Reg.datum: Nov 2003
Inlägg: 214
Hej!

Har lite problem med prestanda eller egentligen en allmän fundering kring denna typ av mysql frågor.
Nedanstående ska helt enkelt ta ut de 10 som senast har loggat in på ett system (tabellen inloggs ) och visa upp deras medlemsnamn som finns i en annan tabell (member)

SELECT
inloggs.*, member.user_name
FROM
inloggs, member
WHERE
inloggs.user_id=member.user_id
ORDER BY inloggs.id DESC
LIMIT 0,10

Denna tar ca 0.7 sekunder att exekvera,vilket i och för sig är godtagbart just nu men då innehåller inloggstabellen 120000 rader och members ca 6000 rader, inte speciellt mycket alltså....
(inloggs.user_id och member.user_id är indexerade, inloggs.id är auto increment)

Denna fråga går att optimera så här:

SELECT
inloggs.*, member.user_name
FROM
inloggs, member
WHERE
inloggs.user_id=member.user_id
AND inloggs.id > 119990
ORDER BY inloggs.id DESC
LIMIT 0,10


Alltså man hämtar först ut max värde för id och drar ifrån 10 , men det känns lite omständigt att behöva en extra query för detta..hur kan man annars göra ..någon som vet..?
danjel är inte uppkopplad   Svara med citatSvara med citat
Oläst 2003-11-24, 21:41 #2
Anders Anders är inte uppkopplad
Supermoderator
 
Reg.datum: Oct 2003
Inlägg: 833
Anders Anders är inte uppkopplad
Supermoderator
 
Reg.datum: Oct 2003
Inlägg: 833
Citat:
Originally posted by danjel@Nov 24 2003, 16:29
Alltså man hämtar först ut max värde för id och drar ifrån 10 , men det känns lite omständigt att behöva en extra query för detta..hur kan man annars göra ..någon som vet..?
Ta och kolla lite på HAVING.
http://www.mysql.com/doc/en/SELECT.html
Eftersom du kan ha både HAVING och WHERE så borde det går i samma query. Sen kan du ju kolla lite på LEFT JOIN och UNION.
Anders är inte uppkopplad   Svara med citatSvara med citat
Oläst 2003-11-25, 01:21 #3
Tobbe Tobbe är inte uppkopplad
Supermoderator
 
Reg.datum: Jan 2003
Inlägg: 1 566
Tobbe Tobbe är inte uppkopplad
Supermoderator
 
Reg.datum: Jan 2003
Inlägg: 1 566
Tror du ska ta dig en titt på JOINs...
__________________
www.cellsynt.com
Tobbe är inte uppkopplad   Svara med citatSvara med citat
Oläst 2003-11-25, 01:37 #4
ZNs avatar
ZN ZN är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: Apr 2003
Inlägg: 1 214
ZN ZN är inte uppkopplad
Har WN som tidsfördriv
ZNs avatar
 
Reg.datum: Apr 2003
Inlägg: 1 214
Observera att UNION inte stöds i versioner äldre än 4.
ZN är inte uppkopplad   Svara med citatSvara med citat
Oläst 2003-11-26, 13:11 #5
danjel danjel är inte uppkopplad
Medlem
 
Reg.datum: Nov 2003
Inlägg: 214
danjel danjel är inte uppkopplad
Medlem
 
Reg.datum: Nov 2003
Inlägg: 214
Tack för era synpunkter. Kör inte mySQL 4 så varken union eller subqueries kan användas dessvärre...
Jag kan få det att funka med having men då tar det ca 4 sekunder :huh:
danjel är inte uppkopplad   Svara med citatSvara med citat
Oläst 2003-11-27, 18:04 #6
Anders Anders är inte uppkopplad
Supermoderator
 
Reg.datum: Oct 2003
Inlägg: 833
Anders Anders är inte uppkopplad
Supermoderator
 
Reg.datum: Oct 2003
Inlägg: 833
Citat:
Ursprungligen postat av danjel
Tack för era synpunkter. Kör inte mySQL 4 så varken union eller subqueries kan användas dessvärre...
Jag kan få det att funka med having men då tar det ca 4 sekunder :huh:
Ok, hur lång tid tar det med JOIN då? Då kan du ju köra två frågor "samtidigt"...

Citat:
Ursprungligen postat av danjel
Nedanstående ska helt enkelt ta ut de 10 som senast har loggat in på ett system (tabellen inloggs ) och visa upp deras medlemsnamn som finns i en annan tabell (member)
[...]
då innehåller inloggstabellen 120000 rader och members ca 6000 rader [...]
Du kan inte rensa tabellen inloggs nån gång då och då? Detta snabbar ju upp sökningen då det inte är lika mycket data som ska sökas igenom. Dessutom kan du:
* istället för att skriva LIMIT 0,10 skriva bara LIMIT 10
* istället för att hämta inloggs.* bara hämta de fält du behöver; inloggs.user_id
Dessa två punkter gör inte så mycket, men sen när det blir ännu mer kommer det synas mer.
Anders är inte uppkopplad   Svara med citatSvara med citat
Oläst 2003-11-27, 19:02 #7
danjel danjel är inte uppkopplad
Medlem
 
Reg.datum: Nov 2003
Inlägg: 214
danjel danjel är inte uppkopplad
Medlem
 
Reg.datum: Nov 2003
Inlägg: 214
Tack för sypunkterna lunne..
Citat:
Ok, hur lång tid tar det med JOIN då? Då kan du ju köra två frågor "samtidigt"...
..osäker på vad du menar, frågan använder ju redan en join..?

Ja att rensa tabellen,det har du rätt i, man bör nog rensa den rätt ofta...

Får ner det till 0.5 sekunder som bäst..
men boven i dramat är ORDER BY har jag märkt,
tar jag bort den tar frågan ca 0.025 sekunder...
danjel är inte uppkopplad   Svara med citatSvara med citat
Oläst 2003-11-27, 19:19 #8
Anders Anders är inte uppkopplad
Supermoderator
 
Reg.datum: Oct 2003
Inlägg: 833
Anders Anders är inte uppkopplad
Supermoderator
 
Reg.datum: Oct 2003
Inlägg: 833
Citat:
Ursprungligen postat av danjel
Tack för sypunkterna lunne..
Så lite så, tycker ju det är intressant med optimering...

Citat:
Originally posted by -danjel@Nov 27 2003, 16:02
Citat:
Ok, hur lång tid tar det med JOIN då? Då kan du ju köra två frågor "samtidigt"...
..osäker på vad du menar, frågan använder ju redan en join..?
Jo, det var bara en tanke. Men jag tycker inte det blir riktigt rätt sätt att använda JOIN på, skit i det. Skulle dessutom vara slött...

Citat:
Originally posted by -danjel@Nov 27 2003, 16:02
Ja att rensa tabellen,det har du rätt i, man bör nog rensa den rätt ofta...
Jo, behöver du datan någon annanstans, eller går det sammanfatta i en annan tabell?

Citat:
Ursprungligen postat av danjel
Får ner det till 0.5 sekunder som bäst..
men boven i dramat är ORDER BY har jag märkt,
tar jag bort den tar frågan ca 0.025 sekunder...
Jo, men är det noga vem av de 10 som loggade in sist?
Anders är inte uppkopplad   Svara med citatSvara med citat
Oläst 2003-12-01, 15:09 #9
clindh clindh är inte uppkopplad
Nykomling
 
Reg.datum: Oct 2003
Inlägg: 6
clindh clindh är inte uppkopplad
Nykomling
 
Reg.datum: Oct 2003
Inlägg: 6
Problemet tror jag är att du gör en descending order by - testa att sortera åt andra hållet och se om det hjälper. Med ditt lilla urval kan du ju alltid vända på ID:na i minnet sedan eller iterera resultatet baklänges.

I MySQL 4 skall det finnas ett sätt att bygga index så att de istället ordnas descending - men jag vet inte exakt hur...
clindh är inte uppkopplad   Svara med citatSvara med citat
Oläst 2003-12-01, 16:23 #10
Anders Anders är inte uppkopplad
Supermoderator
 
Reg.datum: Oct 2003
Inlägg: 833
Anders Anders är inte uppkopplad
Supermoderator
 
Reg.datum: Oct 2003
Inlägg: 833
Citat:
Originally posted by clindh@Dec 1 2003, 12:09
Problemet tror jag är att du gör en descending order by - testa att sortera åt andra hållet och se om det hjälper. Med ditt lilla urval kan du ju alltid vända på ID:na i minnet sedan eller iterera resultatet baklänges.
Man tjänar sällan något på att sortera efter man fått ut datan från databasen, för MySQL i detta fall, är rätt snabb på det. Min erfarenhet säger mig att ASP och PHP är minst lika "slöa" på att sortera. Men man kan ju alltid prova.
Anders ä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 08:17.

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