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:
- 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
- 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)
- Använd EXPLAIN före SELECT manuellt för att se var flaskhalsar kan sitta.
- 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.
- Tråda så mycket som möjligt. Men var inte dum
- 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.
- Bryt ner SQL-frågorna och utred vilket värde som tar lång tid att få fram.
- Kör SHOW FULL PROCESSLIST ibland och titta på ”Time” fältet där du ser hur lång tid frågor tar.
- Undvik ORDER BY RAND() då dessa frågor kopieras till en temporär tabell vilket tar tid.
- 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å.
- 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.
- Använd LIMIT där det är möjligt.
- Testa att lägg databasen på en separat hårddisk (datadir). Är standard /var/mysql på de flesta OS.
- Kör OPTIMIZE TABLE en gång i veckan eller en gång per månad.
- Ställ dig frågan att det kanske inte är databasen det är fel på utan kanske hur DU använder den.
- 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.
Ett litet tillägg angående InnoDB/MyISAM – InnoDB är the choice för data man vill ha reguljär transaktionshantering för (begin/commit/rollback). Har row locking (som du antyder).
MyISAM är perfekt för data av ’log-typ’, dvs data man sparar för tex tracking purposes (vem gjorde vad och när etc) som skall sparas ett tag och sen slängas. Fördelen där är att diskutrymmet MyISAM-tabeller upptar reclaimas när man droppar eller gör deletes. Droppar man en InnoDB-tabell, så får man inte utrymmet åter (iaf inte utan att joxa med mysql)
Läs min blog:http://hellrefaraherde.blogspot.com/
Bra artikel! Skrev en guide som går igenom punkt 11 lite närmare.. Dock går jag bara igenom generella inställningar och inte inställningar som är specifika för InnoDB eller MyISAM.