Avatar billede kiddoe Nybegynder
18. september 2006 - 21:29 Der 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?
Avatar billede erikjacobsen Ekspert
18. september 2006 - 21:33 #1
Hvad søger du på, og hvad er der index på?
Avatar billede kiddoe Nybegynder
18. september 2006 - 22:07 #2
hejsa, kan du forklare lidt nærmere - jeg er helt ny i MySql og egen Server
Avatar billede erikjacobsen Ekspert
18. september 2006 - 22:15 #3
Hvis ordet "index" ikke siger dig noget, skal du vist i gang med at læse lidt databaseteori.
Avatar billede kiddoe Nybegynder
18. september 2006 - 22:32 #4
jeps, har jo hørt om det og har da også brugt lidt tid på http://dev.mysql.com/doc/refman/4.1/en/optimizing-database-structure.html

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"

Hvad skal antal være?
Avatar billede erikjacobsen Ekspert
18. september 2006 - 22:39 #5
Hvad søger du på?
Avatar billede kiddoe Nybegynder
18. september 2006 - 22:42 #6
jeg søger på TEXT og VARCHAR - går ud fra det er det du mener !!
Avatar billede erikjacobsen Ekspert
18. september 2006 - 22:47 #7
Jeg mener egentlig at vi skal se en tabelstruktur, måske lidt typisk indhold, og så nogle SQL-sætninger. Ellers kan vi jo bare snakke almindeligheder.
Avatar billede kiddoe Nybegynder
18. september 2006 - 23:03 #8
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
   
    'Try a search
    Set rstResults = Server.CreateObject("ADODB.Recordset")
    rstResults.ActiveConnection = MM_conn_STRING
    rstResults.Source = strSQL
    rstResults.CursorType = 0
    rstResults.CursorLocation = 2
    rstResults.LockType = 1
    rstResults.Open()
    rstResults_numRows = 0
   
    '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)
Avatar billede erikjacobsen Ekspert
18. september 2006 - 23:07 #9
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.
Avatar billede kiddoe Nybegynder
18. september 2006 - 23:14 #10
Okay - Jeg skal vist bruge lidt mere tid på "Databaseteori" og finde et andet søgescript :)

Læg et svar, så lukker vi her
Avatar billede erikjacobsen Ekspert
18. september 2006 - 23:18 #11
Jeg samler slet ikke på point, tak.

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.
Avatar billede kiddoe Nybegynder
18. september 2006 - 23:29 #12
Ja men så vil jeg da sige tak for din tid og dine kommentarer
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester