webForumDet fria alternativet

Oändlig exekvering

Databaser & SQLur Databashanterare & SQL

6 svar · 344 visningar · startad av ampy

Medlem sedan feb. 20011 498 inlägg
Frågan#1

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

Medlem sedan feb. 20011 498 inlägg
#2

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?

Medlem sedan feb. 20011 498 inlägg
#3

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?

Medlem sedan dec. 200012 464 inlägg
#4

Vad har du för index då?

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

Medlem sedan feb. 20011 498 inlägg
#5
#
# 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;
Medlem sedan dec. 200012 464 inlägg
#6

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.

Medlem sedan feb. 20011 498 inlägg
#7

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

133 ms totalt · 3 externa anrop · v20260731065814-full.4bcf49fe
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)