WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   Problem med en MySQL sökning (https://www.wn.se/forum/showthread.php?t=5324)

fabian 2005-01-05 03:04

Har efter mycket jobb fått ordning på min bråkande Mysql server som givetvis berodde på dålig kod och annat egenomtänkt (Köpte ett script som jag jobbat vidare på själv).

Den enda sak som mysql inte verkar släppa igenom är följande fråga:
Kod:

select usertable.name, usertable.category from usertable, imagetable WHERE usertable.category = 'Tjejer' AND usertable.age >= '17' AND usertable.age <= '24' GROUP BY usertable.name ORDER BY usertable.name LIMIT 25

Om mysql får den så står den helt still tills jag dödar frågan eller startar om mysqld´n. Jag har två frågor.

1.) Vad är det för fel på frågan?

2.) Hur får jag mysql att döda frågor som tar mer än X antal sekunder?
Trodde att det var: set-variable = wait_timeout=10
i my.cnf, men det var det visst inte, kan utan problem få denna fråga att ta flera tusen sekunder utan att den avbryts.

Thomas 2005-01-05 03:15

Citat:

Originally posted by fabian@Jan 5 2005, 03:04
Trodde att det var: set-variable = wait_timeout=10
i my.cnf, men det var det visst inte ...

Du har väl inte glömt att starta om sql-servern efter ändrigen. Sånt kan ju hända den bäste 03:04 en onsdagsmorgon.

Thomas

fabian 2005-01-05 03:34

Citat:

Ursprungligen postat av Thomas
Citat:

Ursprungligen postat av fabian
Trodde att det var: set-variable = wait_timeout=10
i my.cnf, men det var det visst inte ...

Du har väl inte glömt att starta om sql-servern efter ändrigen. Sånt kan ju hända den bäste 03:04 en onsdagsmorgon.

Thomas

Hehe, nej, jag har startat om den.

(Var dock tvungen att göra det ännu en gång för att vara helt säker)

Finns det något sätt att se så att mysql servern verkligen läser rätt configfil?

zoran 2005-01-05 09:04

Citat:

Originally posted by fabian@Jan 5 2005, 04:04
Har efter mycket jobb fått ordning på min bråkande Mysql server som givetvis berodde på dålig kod och annat egenomtänkt (Köpte ett script som jag jobbat vidare på själv).

Den enda sak som mysql inte verkar släppa igenom är följande fråga:
Kod:

select usertable.name, usertable.category from usertable, imagetable WHERE usertable.category = 'Tjejer' AND usertable.age >= '17' AND usertable.age <= '24' GROUP BY usertable.name ORDER BY usertable.name LIMIT 25

Om mysql får den så står den helt still tills jag dödar frågan eller startar om mysqld´n. Jag har två frågor.

1.) Vad är det för fel på frågan?

2.) Hur får jag mysql att döda frågor som tar mer än X antal sekunder?
Trodde att det var: set-variable = wait_timeout=10
i my.cnf, men det var det visst inte, kan utan problem få denna fråga att ta flera tusen sekunder utan att den avbryts.

Jag fattar bara inte varför du gör select i imagetable (som förmodligen innehåller massa binärdata) när du ändå inte använder värdena i din select.

/Zoran

grazzy 2005-01-05 13:27

Fabian, du har väl inte glömt att indexera alla fälten du gör sökningar i? Sen så "kan" det nog vara dumt att göra '' runt heltal.

kullervo 2005-01-05 13:49

Testa kör REPAIR och sedan OPTIMIZE.

Vilken verision av MySQL kör du? 4.1-serien är fortfarande mycket buggig. Jag har åkt på 3 buggar än så länge. 2 är fixade i 4.1.8 och igår hittade jag den tredje.

Citat:

Finns det något sätt att se så att mysql servern verkligen läser rätt configfil?
/etc/my.cnf är första platsen som mysqld letar efter inställningsfil. Den gäller alltså i första hand.

fabian 2005-01-05 15:41

Citat:

Jag fattar bara inte varför du gör select i imagetable (som förmodligen innehåller massa binärdata) när du ändå inte använder värdena i din select.
Imagetable innehåller:
Namn på den som äger bilden
URL till bilden
Kategori bilden ligger i
Din senaste 10 poängen bilden fått
Dom senaste 5 IP addresser som röstat på bilden
Bildens poäng
etc. etc.


Citat:

Fabian, du har väl inte glömt att indexera alla fälten du gör sökningar i? Sen så "kan" det nog vara dumt att göra '' runt heltal.
Alla fälten som söks i är indexerade. Finns det något sätt att "updatera" indexeringen? För precis när jag gjort indexeringen flöt sajten på jätefint...
Har provat att ta bort citationstecknerna runt heltalen, men fortfarande samma problem.


Citat:

Testa kör REPAIR och sedan OPTIMIZE.
Nu är det gjort, utan någon märkbar skillnad.


Citat:

Vilken verision av MySQL kör du? 4.1-serien är fortfarande mycket buggig. Jag har åkt på 3 buggar än så länge. 2 är fixade i 4.1.8 och igår hittade jag den tredje.
Jag körde på 4.1.7, men har nu uppgraderat till 4.1.8



Några andra idéer?

kullervo 2005-01-05 15:49

Citat:

Originally posted by fabian@Jan 5 2005, 15:41
Citat:

Vilken verision av MySQL kör du? 4.1-serien är fortfarande mycket buggig. Jag har åkt på 3 buggar än så länge. 2 är fixade i 4.1.8 och igår hittade jag den tredje.
Jag körde på 4.1.7, men har nu uppgraderat till 4.1.8



Några andra idéer?

Prova köra koden på senaste ur 4.0-serien.

netflax 2005-01-05 16:40

Citat:

Originally posted by fabian@Jan 5 2005, 04:04
Kod:

select usertable.name, usertable.category from usertable, imagetable WHERE usertable.category = 'Tjejer' AND usertable.age >= '17' AND usertable.age <= '24' GROUP BY usertable.name ORDER BY usertable.name LIMIT 25

I och med att du hämtar data från imagetable också så kommer du att indirekt joina alla records med varandra. Alla records i usertable joinas med imagetable... därför tar det lite tid...

Prova istället att använda följande:

Kod:

select usertable.name, usertable.category from usertable WHERE usertable.category = 'Tjejer' AND usertable.age >= '17' AND usertable.age <= '24' GROUP BY usertable.name ORDER BY usertable.name LIMIT 25
alternativt

Kod:

select usertable.name, usertable.category from usertable, imagetable WHERE usertable.category = 'Tjejer' AND usertable.age >= '17' AND usertable.age <= '24' AND usertable.id = imagetable.userid GROUP BY usertable.name ORDER BY usertable.name LIMIT 25
(OBS! Ändra i sista SQL-satsen så att usertable.id och imagetable.userid är korrekta fält i din tabell, men i ditt fall råder jag dig ändå att välja det första alternativet)

Testa och återkom, men det där borde fixat..

fabian 2005-01-05 19:46

Citat:

Ursprungligen postat av netflax
Citat:

Ursprungligen postat av fabian
Kod:

select usertable.name, usertable.category from usertable, imagetable WHERE usertable.category = 'Tjejer' AND usertable.age >= '17' AND usertable.age <= '24' GROUP BY usertable.name ORDER BY usertable.name LIMIT 25

I och med att du hämtar data från imagetable också så kommer du att indirekt joina alla records med varandra. Alla records i usertable joinas med imagetable... därför tar det lite tid...

Prova istället att använda följande:

Kod:

select usertable.name, usertable.category from usertable WHERE usertable.category = 'Tjejer' AND usertable.age >= '17' AND usertable.age <= '24' GROUP BY usertable.name ORDER BY usertable.name LIMIT 25
alternativt

Kod:

select usertable.name, usertable.category from usertable, imagetable WHERE usertable.category = 'Tjejer' AND usertable.age >= '17' AND usertable.age <= '24' AND usertable.id = imagetable.userid GROUP BY usertable.name ORDER BY usertable.name LIMIT 25
(OBS! Ändra i sista SQL-satsen så att usertable.id och imagetable.userid är korrekta fält i din tabell, men i ditt fall råder jag dig ändå att välja det första alternativet)

Testa och återkom, men det där borde fixat..

Wow, det första exemplet du gav fixade det! Tusen miljoner tack. Vad var den egentliga skillnaden?

guran 2005-01-05 20:27

Om du skall göra en join på två tabeller så måste du ha ett värde för länkar dem tillsammans. T.ex. skall din usertable ha ett user id och din imagetable ett user id. User id i imagetable talar om vilken user i usertable som en image eller flera image tillhör. En korrekt SQL-fråga skulle då vara:

Kod:

SELECT usertable.name FROM usertable, imagetable
WHERE usertable.user_id=imagetable.user_id

Observera att frågan ovan endast kommer att returnera de namn som har en en post i tabellen imagetable.

Att länka två tabeller utan att ange vad de har gemensamt kommer att returnera alla tänkbara möjligheter som finns mellan tabellerna. Ett exempel på detta är om en tabell innehåller två rader med värdena 1 och 2 och en anna tabell innehåller två rader med värdena a och b skulle en länkning utan att ange vad de har gemensamt ge resultatet:

1 a
1 b
2 a
2 b

Detta kallas för Cartesian join. I princip blir resultatet antal rader i tabell_1 * antal rader i tabell_2. Har du två tabeller med 100 rader i varje blir resultatet 10.000 rader. Så två tabeller med 1.000 rader blir 1 miljon rader i retur. Klart att din server får problem.

Det vore kanske bättre om du angav vad du vill ha för resultat, så att en korrekt fråga kan utformas. Jag har en känsla av att du inte får det resultat du vill ha rent logiskt även om resultatet kan se ut att vara riktigt.

fabian 2005-01-06 00:12

Citat:

Originally posted by guran@Jan 5 2005, 21:27
Om du skall göra en join på två tabeller så måste du ha ett värde för länkar dem tillsammans. T.ex. skall din usertable ha ett user id och din imagetable ett user id. User id i imagetable talar om vilken user i usertable som en image eller flera image tillhör. En korrekt SQL-fråga skulle då vara:

Kod:

SELECT usertable.name FROM usertable, imagetable
WHERE usertable.user_id=imagetable.user_id

Observera att frågan ovan endast kommer att returnera de namn som har en en post i tabellen imagetable.

Att länka två tabeller utan att ange vad de har gemensamt kommer att returnera alla tänkbara möjligheter som finns mellan tabellerna. Ett exempel på detta är om en tabell innehåller två rader med värdena 1 och 2 och en anna tabell innehåller två rader med värdena a och b skulle en länkning utan att ange vad de har gemensamt ge resultatet:

1 a
1 b
2 a
2 b

Detta kallas för Cartesian join. I princip blir resultatet antal rader i tabell_1 * antal rader i tabell_2. Har du två tabeller med 100 rader i varje blir resultatet 10.000 rader. Så två tabeller med 1.000 rader blir 1 miljon rader i retur. Klart att din server får problem.

Det vore kanske bättre om du angav vad du vill ha för resultat, så att en korrekt fråga kan utformas. Jag har en känsla av att du inte får det resultat du vill ha rent logiskt även om resultatet kan se ut att vara riktigt.

Tack för en bra beskrivning. Upptäckte att när jag sökte endast på användare med bilder så funkade det det perfekt, men när det var användare utan bild så funkade det inte. Och eftersom jag har snart 15000 medlemmar så blir det en del att söka igenom...

För att bättre förstå vad jag vill ha ut, kolla på
sny gga st. nak en.o rg/s ear ch.php
(Fast ta bort dom onödiga mellanslagen)



Det är inte jag som kodat sajten, utan det är ett köpt script, så jag har nog inte 100% koll på exakt vad det är jag vill ha ut av sökningen, och den är absolut inte optimerad.

För att se hur söksidan ser ut så har ni sourcen här:
sn ygg as t. na ke n. org /s ea rc h. ph p.txt
s nygg ast. nake n.or g/se arch resu lts .php .tx t


Har ni tips på övriga förbättringar i den så är ni varmt välkomna, jag är newbie.

kullervo 2005-01-06 00:20

Citat:

Originally posted by fabian@Jan 6 2005, 00:12
För att se hur söksidan ser ut så har ni sourcen här:
sn ygg as t. na ke n. org /s ea rc h. ph p.txt
s nygg ast. nake n.or g/se arch resu lts .php .tx t

Tips: Byt namn på filerna till .phps istället. Om du har akviterat stöd för det på servern så blir det riktigt snygg utskrift.
Exempel: hedkandi.kullervo. se/class.phpmailer.phps

fabian 2005-01-06 00:37

Citat:

Ursprungligen postat av kullervo
Citat:

Ursprungligen postat av fabian
För att se hur söksidan ser ut så har ni sourcen här:
sn ygg as t. na ke n. org /s ea rc h. ph p.txt
s nygg ast. nake n.or g/se arch resu lts .php .tx t

Tips: Byt namn på filerna till .phps istället. Om du har akviterat stöd för det på servern så blir det riktigt snygg utskrift.
Exempel: hedkandi.kullervo. se/class.phpmailer.phps

Testade med search.phps, men fick inget speciellt vackert resultat. Vad heter funktionen som gör det fint?

kullervo 2005-01-06 00:50

Citat:

Ursprungligen postat av fabian
Citat:

Originally posted by -kullervo@Jan 6 2005, 01:20
Citat:

Ursprungligen postat av fabian
För att se hur söksidan ser ut så har ni sourcen här:
sn ygg as t. na ke n. org /s ea rc h. ph p.txt
s nygg ast. nake n.or g/se arch resu lts .php .tx t

Tips: Byt namn på filerna till .phps istället. Om du har akviterat stöd för det på servern så blir det riktigt snygg utskrift.
Exempel: hedkandi.kullervo. se/class.phpmailer.phps


Testade med search.phps, men fick inget speciellt vackert resultat. Vad heter funktionen som gör det fint?

Eftersom du kör Apache slänger du in det här i httpd.conf
Kod:

AddType application/x-httpd-php-source .phps
Edit: Jag vet iofs inte om det funkar på Apache 2 som du kör, men det borde vara samma syntax. Kolla annars i installationsmanualen till PHP.

fabian 2005-01-06 03:10

Citat:

Ursprungligen postat av kullervo
Citat:

Originally posted by -fabian@Jan 6 2005, 00:37
Citat:

Originally posted by -kullervo@Jan 6 2005, 01:20
Citat:

Ursprungligen postat av fabian
För att se hur söksidan ser ut så har ni sourcen här:
sn ygg as t. na ke n. org /s ea rc h. ph p.txt
s nygg ast. nake n.or g/se arch resu lts .php .tx t

Tips: Byt namn på filerna till .phps istället. Om du har akviterat stöd för det på servern så blir det riktigt snygg utskrift.
Exempel: hedkandi.kullervo. se/class.phpmailer.phps


Testade med search.phps, men fick inget speciellt vackert resultat. Vad heter funktionen som gör det fint?


Eftersom du kör Apache slänger du in det här i httpd.conf
Kod:

AddType application/x-httpd-php-source .phps
Edit: Jag vet iofs inte om det funkar på Apache 2 som du kör, men det borde vara samma syntax. Kolla annars i installationsmanualen till PHP.

Yes, funkar fint.

Har gjort om båda filerna till phps nu.


Alla tider är GMT +2. Klockan är nu 18:46.

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