De dåliga nyheterna:det finns GUI-verktyg för att hjälpa till med detta, men det är ett skickligt och omfattande jobb. Så de täcker inte allt, det är troligt att du kommer att behöva använda kommandoradssaker/sql-satser etc för att hjälpa. Jag har egentligen bara använt kommandoradsverktygen. Jag ska ge lite av en översikt över saker jag vet/har använt:
Först behöver du en bra databasdesign. Om designen är dålig kan man bara komma så långt. Detta inkluderar normalisering, såväl som att använda lämpliga typer för fält. Jag lämnar denna punkt här, eftersom jag tycker att det är lite åt sidan och inte vad du är ute efter.
Se till att MySQL Query Cache är inställd och fungerar och ge den lite mer RAM om du kan, och se till att dina viktiga frågor inte gör något som hindrar mysql att cache dem. Om du till exempel använder funktionen NOW() i frågor gör detta - av uppenbara skäl - NU ändras varje sekund! Du kan istället lägga en tidsstämpel i sql, och använda tiden till närmaste minut/timme/dag (den största perioden du kan komma undan med) för att tillåta mysql att få en viss cachningsfördel.
För att börja optimera saker:Att sticka "EXPLAIN" framför select är SÄTTET att se hur en fråga exekveras och ange hur man kan förbättra den. Lär dig att tolka resultatet:http://dev.mysql .com/doc/refman/5.0/en/using-explain.html Du kommer ofta att kunna lägga till nya index/lägga till kolumner till befintliga för att förbättra saker. Men du kommer också att stöta på tillfällen då frågor behöver omstruktureras.
Att börja med att förbättra prestandan med MySQL (förutsatt att du inte redan vet vad problemet är) är att kontrollera den långsamma frågeloggen - den loggar till en fil alla frågor som tar längre tid än x sekunder.
Översikt, inklusive config för om det inte redan loggar detta, finns här:http://dev.mysql.com/doc/refman/5.0/en/slow-query-log.html – Jag har också funnit att att sätta long_query_time till 0 för en dag eller så, så att alla frågor loggas här med tiden, är ett användbart sätt att få en uppfattning om exakt vart prestandan är på väg. Men jag skulle inte åka dit direkt! Och lämna den inte på, stockarna kan bli enorma.
När du har loggat några dagar har jag hittat mysqlsla (mysql slow log analysator) härifrån:http://hackmysql.com/mysqlsla är ett bra verktyg.
Den kan göra mer än bara långsam frågelogganalys - läs manualen. Men för att förklara vad det gör för långsamma loggar:den långsamma frågeloggen kan innehålla mycket data, så det kan vara svårt att ta reda på vilka frågor som är de dyraste totalt sett - t.ex.:ta hänsyn till hur många gånger de körs och när två frågor är faktiskt samma sak med ett annat id i en where-klausul.
MySQL sla gör allt detta åt dig. Den körs genom loggen och kan gruppera frågor som är samma/har olika värden i where-satserna. Den presenterar sedan (som standard) de 10 bästa frågorna i termer av total körningstid - som ofta har några överraskningar, men vanligtvis är den mest produktiva utgångspunkten - ta den dyraste frågan och använd EXPLAIN på den och se om du kan förbättra det.
Vissa frågor tar lång tid och kan inte enkelt förbättras. I det här fallet, kan du få data på ett annat sätt eller åtminstone cache det istället? Du kanske till och med upptäcker att du måste ändra DB-schemat. På samma sätt kan vissa frågor vara överst i mysqlsla-utgången eftersom du kör dem mycket (särskilt sant om long_query_time är satt till 0), även om de körs ganska snabbt. Kanske dags att lägga till lite cachning i din app?
http://www.maatkit.org/ ser också lovande ut - har aldrig använt det, men verktyget mk-query-profiler borde vara användbart för att ytterligare undersöka varför frågorna går långsammare.
En helt separat sak att titta på också:"status"-sidan i PHPMYADMIN (eller så kan du köra alla frågor för att generera denna information ....) - den markerar saker som den tror kan vara dåliga i rött, och kan hjälpa dig se var du kan få nytta av att allokera systemresurser. Jag vet inte så mycket om detta - mitt tillvägagångssätt har alltid varit att om något är rött och ser dåligt ut, att gå och läsa på om det och bestämma om det är viktigt och om jag ska göra något (betyder vanligtvis att tilldela mer resurser till MySQL genom att ändra konfiguration).
Nyligen har jag funnit att att köra SHOW PROCESSLIST också kan vara användbart på en server som lider. Även om det bara ger dig liveinformation (ja, en live ögonblicksbild) kan den hjälpa dig att få en känsla för vad som händer vid en viss tidpunkt, särskilt om du uppdaterar några gånger och observerar förändringarna. Jag såg nyligen en server som använder alla tillgängliga mysql-anslutningar för att köra en identisk fråga med den här metoden. Visst, det skulle ha funnits i den långsamma frågeloggen, men detta är ett riktigt snabbt och självklart sätt att se vad som hände.