FAQ |
Kalender |
2003-11-24, 19:29 | #1 | ||
|
|||
Medlem
|
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..? |
||
Svara med citat |
2003-11-24, 21:41 | #2 | ||
|
|||
Supermoderator
|
Citat:
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. |
||
Svara med citat |
2003-11-25, 01:21 | #3 | ||
|
|||
Supermoderator
|
Tror du ska ta dig en titt på JOINs...
__________________
www.cellsynt.com |
||
Svara med citat |
2003-11-25, 01:37 | #4 | |||
|
||||
Har WN som tidsfördriv
|
Observera att UNION inte stöds i versioner äldre än 4.
|
|||
Svara med citat |
2003-11-26, 13:11 | #5 | ||
|
|||
Medlem
|
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: |
||
Svara med citat |
2003-11-27, 18:04 | #6 | ||
|
|||
Supermoderator
|
Citat:
Citat:
* 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. |
||
Svara med citat |
2003-11-27, 19:02 | #7 | ||
|
|||
Medlem
|
Tack för sypunkterna lunne..
Citat:
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... |
||
Svara med citat |
2003-11-27, 19:19 | #8 | |||||
|
||||||
Supermoderator
|
Citat:
Citat:
Citat:
Citat:
|
|||||
Svara med citat |
2003-12-01, 15:09 | #9 | ||
|
|||
Nykomling
|
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... |
||
Svara med citat |
2003-12-01, 16:23 | #10 | ||
|
|||
Supermoderator
|
Citat:
|
||
Svara med citat |
Svara |
|
|