Hej!
Har problem med en sql-sats.
SELECT * FROM user AS u INNER JOIN user_e AS ue ON u.user_id = ue.user_extended_id WHERE userEmail != '' AND user_id IN(
SELECT boardUser FROM board WHERE boardClub = variabel)
mySql är det som används.
De 3 tabellerna:
board
-----
boardID primary AI
boardUser int(10)
boardClub int(10)
1900 rader
user
-----
userID primary AI
userEmail varchar(100)
55000 rader
user_e
------
userID primary
userClub int(10)
55000 rader
Problemet är att ovanstående anrop tar ca 1 minut. Än värre är det om jag kör ytterligare en nästling (query1 IN(query2 IN (query3)), då sänker jag hela siten som slutar svara på anrop.
Så, är det något fel på koden, är det en dålig metod som är seg eller är något annat fel?
LaspMedlem sedan juli 200012 980 inlägg Om du har ett 1 till 1 förhållande på user och user_e har du nog felet där! Slåihop tabellerna då!
Gjorde om sql:en till:
SELECT * FROM user WHERE userID IN(
SELECT boardUser FROM board WHERE boardClub = variabel)
Problemet kvarstår dock.
@ndersMedlem sedan juni 200032 969 inlägg Om du skriver den som en join då?
SELECT user.* FROM user
INNER JOIN boardUser ON user.userId = boardUser.boardUser AND boardClub = variabel
Har du primärnycklar / index rätt satta?
SELECT * FROM user AS u
INNER JOIN user_e AS ue ON u.user_id = ue.user_extended_id
INNER JOIN board b ON u.user_id = b.boardUser
WHERE userEmail != '' AND b.boardClub = variabel;
Du bör nästan alltid undvika IN av prestandaskäl. Prova frågan ovan. Har du för övrigt satt index på alla relevanta kolumner? Alla primärnycklar bör vara indexerade som sådana. User_extended_id bör ha ett normalt index.
Fungerade bra att Joina dom istället. Vad som är primärnycklar syns i första inlägget, tror inte något av de fält som används är indexerade.
Så har iaf en lösning, vore bara intressant att veta varför det blir så fel...
Tack @nders!
nitro2k01 skrev:
Du bör nästan alltid undvika IN av prestandaskäl. Prova frågan ovan.
Ok, då skippar jag det helt, tyckte det bara var smidigt :)
nitro2k01 skrev:
Har du för övrigt satt index på alla relevanta kolumner? Alla primärnycklar bör vara indexerade som sådana. User_extended_id bör ha ett normalt index.
Den som skapade databasen hade nog inte full koll. Jag har inte heller full koll för att ändra i efterhand, vill inte "ha sönder nåt" :)
Tack för input!
colahelge skrev:
Så har iaf en lösning, vore bara intressant att veta varför det blir så fel...
Tack @nders!
När du kör originalfrågan sker troligen följande:
- SELECT boardUser FROM board WHERE boardClub = variabel körs och du får tillbaka ett resultat-set på ett par rader.
- Varje enskild post i user söks igenom för att se om någon rad matchar resultatet från 1). Hade du använt en join hade databasen kunnat använda genvägar för att göra samma sak snabbare.
Har du riktig otur körs frågan i 1) en gång för varje rad i user.