18. september 2006 - 21:29Der er
11 kommentarer og 1 løsning
MySql er langsom
Hej, Jeg er lige begyndt at kigge lidt på egen server (XP med IIS) og har installeret MySql. Det er ca 150.000 links i db'en. Men det går meget langsomt med at trække data ud, f.eks ved søgninger selv om der evt. kun er 2 - 3 poster der matcher. Det kan tage op til 3 minutter at få resultatet vist!! og maskinen går næsten helt død.
- Så mit spørgsmål er Hvad kan det skyldes? og Hvad kan jeg evt. gøre ved det?
Index optimerer db'en ydelse - men jeg har ikke rigtigt turde lave nogle ændringer i MySqlAdmin Ved tabellerne der står "Dan et index på <felt> x antal <felt> koloner"
tabellen har to feldter der bliver søgt i med SELECT
fPage VARCHAR(255) UNIQUE FContent TEXT - FULLTEXT
/// søgedelen plukket ud af scriptet
'if the length of ANY word is less than 3 letters we must do a slow search dim slowsearch, iStart, iStop slowsearch = false iStart = 1 iStop = 1 do while instr(iStart, sTerm, " ") > iStart iStop = instr(iStart, sTerm, " ") if iStop - iStart < 4 then slowsearch = true iStart = iStop loop if len(sTerm) < 4 then slowsearch = true
'the main search block Dim rstResults Dim rstResults_numRows
'are there any quotes there already? If so, don't add them on artificially but take the ss as a literal string dim hasQuotes hasQuotes = false if instr(sTerm, Chr(34)) <> 0 then hasQuotes = true else 'artificially put on quotes to see if we can get the whole phrase first sTerm = Chr(34) & sTerm & Chr(34) end if 'get the source strSQL = "SELECT * FROM " & tblpages & " " if slowsearch = true then if domGroup = "" then 'std search, no dom specified so group by domains strSQL = strSQL & " WHERE fContent LIKE '%" & sTerm & "%' GROUP BY fDomain ORDER BY fHits DESC LIMIT 100" else 'domain specified strSQL = strSQL & " WHERE fDomain='" & domGroup & "' AND fContent LIKE '%" & sTerm & "%' ORDER BY fHits DESC LIMIT 100" end if elseif slowsearch = false then if domGroup = "" then 'std search, no dom specified so group by domains strSQL = strSQL & " WHERE match (fContent) against ('" & sTerm & "' IN BOOLEAN MODE ) GROUP BY fDomain ORDER BY fHits DESC LIMIT 100" else 'domain specified strSQL = strSQL & " WHERE fDomain='" & domGroup & "' AND match (fContent) against ('" & sTerm & "' IN BOOLEAN MODE ) ORDER BY fHits DESC LIMIT 100" end if else 'no records strSQL = "SELECT fIndex FROM tblpages WHERE fIndex = 0" end if
'if there's no result and we artificially added quotes, take them off and try again if rstResults.EOF AND hasQuotes = false then rstResults.Close() 'Set rstResults = Nothing sTerm = Replace(sTerm, Chr(34), "") 'Set rstResults = Server.CreateObject("ADODB.Recordset") 'get the source strSQL = "SELECT * FROM " & tblpages & " " if slowsearch = true then if domGroup = "" then strSQL = strSQL & " WHERE fContent LIKE '%" & sTerm & "%' GROUP BY fDomain ORDER BY fHits DESC LIMIT 100" else strSQL = strSQL & " WHERE fDomain='" & domGroup & "' AND fContent LIKE '%" & sTerm & "%' ORDER BY fHits DESC LIMIT 100" end if elseif slowsearch = false then if domGroup = "" then strSQL = strSQL & " WHERE match (fContent) against ('" & sTerm & "' IN BOOLEAN MODE ) GROUP BY fDomain ORDER BY fHits DESC LIMIT 100" else strSQL = strSQL & " WHERE fDomain='" & domGroup & "' AND match (fContent) against ('" & sTerm & "' IN BOOLEAN MODE ) ORDER BY fHits DESC LIMIT 100" end if else 'no records strSQL = "SELECT fIndex FROM tblpages WHERE fIndex = 0" end if rstResults.Source = strSQL rstResults.CursorType = 0 rstResults.CursorLocation = 2 rstResults.LockType = 1 rstResults.Open() rstResults_numRows = 0 end if
'get rid of the bits and pieces dim tempS tempS = sTerm tempS = Replace ( tempS, "*", "") tempS = Replace ( tempS, "+", "") tempS = Replace ( tempS, "-", "") tempS = Replace ( tempS, Chr(34), "" )
'get an array of all the words in the search string 'sTerm = Replace(sTerm, Chr(34), "") Dim sSearch, sSnippet, sMarkedString sSearch = tempS
dim aWords aWords = Split(sSearch, " ") 'create the marked string sMarkedString = "" for i = 0 to Ubound(aWords) sMarkedString = sMarkedString & "<b>" & aWords(i) & "</b> " next sMarkedString = trim(sMarkedString)
Ok, men hvad skal vi bruge det til? Du må fortælle hvad der går langsomt - der er alt for meget gætværk. En konstruktion som ...WHERE fContent LIKE '%" & sTerm & "%' ... går så langsomt, så du vil synes DSB kører med lysets hastighed.
Men jeg skal da sige at de to felter ellers er fornuftige. Unique giver automatisk et index, og FULLTEXT på mere end 3 tegn er så effektivt, som man kan forvente. Jeg har ikke kigget scriptet efter så grundigt, men hvis du oplever at hastigheden er langsom når du søger efter "abe", men hurtigt når du søger efter "abekat", så er der nok en forklaring.
Ja men så vil jeg da sige tak for din tid og dine kommentarer
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.