---
title: "Oändlig exekvering"
type: "forum-thread"
url: "https://www.webforum.nu/amne/databaser-sql/100597-oändlig-exekvering"
topic: "Databaser & SQL"
topic_url: "https://www.webforum.nu/amne/databaser-sql"
author: "ampy"
published: "2004-03-29T21:54:10.000Z"
updated: "2004-04-02T19:23:06.000Z"
replies: 6
views: 379
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/databaser-sql/100597-oändlig-exekvering"
---

# Oändlig exekvering

## #1 — ampy, 2004-03-29T21:54Z

Har en sql-fråga som verkar ha en liten flaskhals. Så här ser frågan ut:

```
SELECT
	gmsg.writer_id, 
	gmsg.msg, 
	gmsg.datum, 
	gmsg.unread, 
	m1.usr, 
	ga.msg
FROM
	guestbook_messages gmsg
	inner join members m1 on m1.id = gmsg.writer_id
	left outer join guestbook_answers ga on ga.msg_id = gmsg.id
WHERE
	gmsg.owner_id = 1
ORDER BY
	gmsg.id desc limit 0,10
```

Efter att ha lokaliserat flaskhalsen så är det 'left outer join' som ställer till det. Skriver jag istället 'inner join' så fungerar sql-frågan utan problem.

Varför tar det så lång tid att ladda med 'left outer join'?

Tabellerna innehåller ungerfär 30 000 rader och jag har indexerat dem. Men 30 000 rader ska väl inte vara några problem?

DBMS: MySQL

Permalänk: https://www.webforum.nu/p/100597

## #2 — ampy, 2004-03-30T19:55Z

Efter lite experimenterande har jag kommit fram till att det är antalet poster/rader i tabellerna som är flaskhalsen, trots att jag har indexerat.

När jag tog bort majoriteten av raderna (lät 200 rader vara kvar) exekveras sql-frågan på cirka 1,5 sekunder. 

Självaste applikation sql-frågan hör till är till en gästbok. Alla gästboksinlägg ligger i 'guestbook_messages'. Varje gästboksinlägg *kan* ha ett svar, som då ligger i tabellen 'guestbook_answers'. Eftersom det inte är säkert att ett gästboksinlägg innehåller ett svar måste jag använda mig utav 'outer join'. 

Är det optimalt att dela upp inläggen och svaren i två separerade tabeller. Kanske är det mer optimalt att lägga allt i samma tabell?

Permalänk: https://www.webforum.nu/p/1311962

## #3 — ampy, 2004-03-31T18:50Z

Efter att ha testat med att lägga **inlägg** och **svar** i samma tabell märkte jag att det är precis lika "värdelöst" som att lägga dem i separerade tabeller. 

Kanske ska förtydliga lite mer vad jag har för data och vad jag vill ha för resultat på utskriften. 

Data jag har är **inlägg** och **svar**. Till varje inlägg *kan* det finnas maximalt ett svar. Det är självaste gästboksägaren som svarar på inlägget och därför behöver det inte finnas ett svar till varje inlägg. 
Självaste utskriften ska vara så att det skrivs ut 10 inlägg på varje sida, m.h.a. "paging". Maximalt kan det alltså skrivas ut 20 st poster (10 inlägg + 10 svar) på varje sida. 

Problematiken ligger i att så fort jag använder 'outer join' så hänger sig applikationen. Troligen för att det handlar om så många poster. 

Så kan man formulera en sql-fråga där man **inte** använder sig utav 'outer join', i så fall hur lyder den?

Eller är det någon som har en idé på en helt annan databasstruktur som lämplar sig bättre i detta fall?

Permalänk: https://www.webforum.nu/p/1312471

## #4 — LarsG, 2004-04-01T20:18Z

Vad har du för index då?

Lägg gärna ut create-statement för aktuella tabeller och index.

Permalänk: https://www.webforum.nu/p/1313109

## #5 — ampy, 2004-04-01T21:18Z

```
#
# Table structure for table 'guestbook_answers'
#

CREATE TABLE guestbook_answers (
  id int(8) unsigned NOT NULL auto_increment,
  owner_id int(6) unsigned NOT NULL default '0',
  writer_id int(6) unsigned NOT NULL default '0',
  msg longtext NOT NULL,
  unread tinyint(1) NOT NULL default '0',
  msg_id int(8) unsigned NOT NULL default '0',
  PRIMARY KEY  (id),
  KEY agare_id (owner_id,writer_id,msg_id)
) TYPE=MyISAM;

#
# Table structure for table 'guestbook_messages'
#

CREATE TABLE guestbook_messages (
  id int(8) unsigned NOT NULL auto_increment,
  owner_id int(6) unsigned NOT NULL default '0',
  writer_id int(6) unsigned NOT NULL default '0',
  msg longtext NOT NULL,
  datum datetime NOT NULL default '0000-00-00 00:00:00',
  unread tinyint(1) NOT NULL default '0',
  PRIMARY KEY  (id),
  KEY agare_id (owner_id,writer_id)
) TYPE=MyISAM;
```

Permalänk: https://www.webforum.nu/p/1313163

## #6 — LarsG, 2004-04-02T16:52Z

Då du bara kan ha ett svar på ett inlägg så skulle jag definera tabellen så att inlägget och svaret låg som två olika kolumner i samma post. Att lägga till ett svar blir då en update och du slipper outer join.

Permalänk: https://www.webforum.nu/p/1313501

## #7 — ampy, 2004-04-02T19:23Z

Tänkte på det alternativet också men det följer väl inte normaliseringen?
Fast får väl göra ett undantag. :)

Permalänk: https://www.webforum.nu/p/1313596

---

Tråden på webben: https://www.webforum.nu/amne/databaser-sql/100597-oändlig-exekvering
