MySQL - seturi de date medii ca marime

Sa pornim o discutie si despre MySQL, ca de bine de rau e cea mai populara solutie de DB la momentul asta.

Chestie pe care o cercetez de ceva vreme e eterna discutie cu MyISAM vs InnoDB. Absolut peste tot unde gasesti articole de genul (mai ales de la mysql 5.+ incoace) concluzia clara este ca InnoDB kicks ass.

Ce nu spune nici un articol din astea este ca pentru seturi de date mici si medii (milioane de randuri sa zicem), MyISAM e vizibil mai rapid. Pur si simplu nu incape comparatie, uneori diferentele ajungand si la un ordin de marime.

Experiente in directia asta?

Parerea mea este ca lucrurile sunt destul de simple.

  1. Daca ai nevoie de tranzactii, foregin keys, etc atunci forget about myisam.
  2. Daca trebuie match against foloseste myisam. Aici totusi , ar trebuie sa folosesti alt engine daca vorbim de cautare.

Daca ai multe update-uri sau inserturi pe tabela, e bine sa parasesti MyISAM caci acestea vor face lock pe tabela, si vei avea select-urile blocate.

Pentru tabele foarte mari poti ramane pe MyISAM si cu partitionare si vei scapa de unele probleme.

Eu am folosit in productie MyISAM (vesr 4.x sau 5.x) si nu am avut probleme (chiar acolo unde regulile de mai sus incepeau sa se aplice).


  1. Stiu ca nu am epuizat subiectul, am vrut doar sa enunt ce mi se pare mai important si mai rapid de decis.
  2. Daca stii ca nu modifici tabela, recomand sa folosesti ARCHIVE

teorie. testele iti vor arata ca pana n-ai tabele imense, myisam ramane mult mai rapid.

@AdrianBasalic: teoria nu a fost punctul meu forte. Situatia mea era in felul urmator: pe o tabela de circa 1-2G (1 milion de randuri, deca row-ul era un pic maricel) incepusem sa am astfel de probleme. DLM-urile aveau prioritate standard insa cand aveam ceva bursturi, selecturi incepeau sa ramana in coada (erau si ele cu multe conditii, ordonari, etc ).

Nu spun ca setarile MySQL erau perfecte (pentru ca sunt totusi atatea parere), dar respectau liniile generale.

Server hardware config?

Cel mai probabil ca era de genul (din arhiva)

key_buffer = 2048M
max_allowed_packet = 3M
table_cache = 4096
sort_buffer_size = 16M
net_buffer_length = 300K
read_buffer_size = 2M
read_rnd_buffer_size = 2M
myisam_sort_buffer_size = 128M
query_cache_size = 64M
max_connections = 240
join_buffer_size = 600K
open_files_limit = 15000
query_cache_limit = 10M
query_prealloc_size = 8M
thread_cache_size = 64
thread_stack = 200K

max_heap_table_size = 2048M
tmp_table_size = 2048M