Etikettarkiv: fulltext

Optimera din MySQL databas

Jag har suttit många månader och felsökt varför vissa saker går långsamt i MySQL när jag utvecklat bloggsökmotorn och i detta blogginlägg försöker jag sammanfatta de erfarenheter jag lärt mig på vägen:

  1. InnoDB är många gånger att föredra framför MyISAM. Jag fick jättemycket problem med låsningar då jag skriver och läser mycket till stora tabeller. MyISAM är generellt snabbare på INSERT’s
  2. Undvik typkonverteringar. I python exempelvis så görs detta automatiskt ibland och då kan det leda till att MySQL måste göra typkonverteringar vid varje jämförelse.
    • – ”Avoid overuse of MySQL’s automatic type conversion. MySQL will perform automatic type conversion, but if you can avoid conversions, you may get better performance” (från boken MySQL: The definitive guide to using, programming, and administering MySQL 4.1 and 5.0, Third Edition)
  3. Använd EXPLAIN före SELECT manuellt för att se var flaskhalsar kan sitta.
  4. Försök att undvika FULLTEXT indextyper, en vacker dag så sitter du där med tonvis med information och sökningarna tar flera sekunder. Snegla istället på Sphinx.
  5. Tråda så mycket som möjligt. Men var inte dum
  6. Slå på log_slow_queries i my.cnf och kolla loggen vilka frågor som går långsamt och försök optimera dessa.
  7. Bryt ner SQL-frågorna och utred vilket värde som tar lång tid att få fram.
  8. Kör SHOW FULL PROCESSLIST ibland och titta på ”Time” fältet där du ser hur lång tid frågor tar.
  9. Undvik ORDER BY RAND() då dessa frågor kopieras till en temporär tabell vilket tar tid.
  10. Ha full koll på dina INDEX så att de används på ett optimalt sätt. Inte för många och inte för få.
  11. Försök att tweaka my.cnf så att den stämmer överens med just din hårdvara gällande RAM-minne osv. Exempelvis så kan innodb_buffer_pool_size vara upp till 80% av minnesstorleken.
  12. Använd LIMIT där det är möjligt.
  13. Testa att lägg databasen på en separat hårddisk (datadir). Är standard /var/mysql på de flesta OS.
  14. Kör OPTIMIZE TABLE en gång i veckan eller en gång per månad.
  15. Ställ dig frågan att det kanske inte är databasen det är fel på utan kanske hur DU använder den.
  16. Läs mysqlperformanceblog.com samt Google är din vän.

Såja, hoppas det var allt. Fyller på om det är något som jag glömt.

Sökningar i MySQL MyISAM FULL-TEXT

När bloggz.se kom upp i över en miljon indexerade blogginlägg så började MySQL att gå på knäna så jag trodde ju såklart genast att jag hade gjort något fel när det gäller optimeringen av de index som jag använder mig av. Så jag la ungefär en månad på att felsöka och försöka lista ut vad som var galet, visst hittade jag diverse fel som gjorde att sökningarna tog långsammare men tillslut så gav även jag upp och började titta på nya alternativ.

Eter ett tag så fann jag det jag sökte efter: Sphinx. Sphinx indexerar hela MySQL full-text databastabellen och gör den sökbar på långt under en sekund. Vilken lycka! Nu kan jag sova lungt igen.