Citat:
Aleksandrov: Tacan zahtev mi je da na 15 minuta zapisem energije sa oko 250-300 uredjaja i da cuvam u bazi koliko mi to hardver dozvoljava.
super zahtev ... ovako .. to sto ti pravis je takozvani "logger" ... ti insertujes podatke, retko ih citas a nikad menjas. podaci su ti jednostavni (nekoliko integera i nekoliko realnih brojeva i to je to) tako da ti tabela vec ima "fiksnu sirinu".
imas 2 principa.
1. radi na svim mysql verzijama, isprobano dobar
- koristis MyISAM storage engine za tabele
- na kraju meseca odradis kreiranje nove tabele like sada, rename sada u bekap i nova u sada i onda staru tabelu (bekap) alter table backup engine=archive (prebacis tu staru tabelu u storage engine koji se zove archive). Archive storage engine je read only, i podatke cuva "kompresovano" tako da zauzimaju malo mesta na disku (spomenuo si da ti je masina matora). eventualno pobrises tabele starije od xyz meseci (zavisi koliko dugo oces da cuvas podatke).
2. radi samo na 5.1 i nije bas 100% safe posto je partitioning i dalje nedovoljno istestiran ali ocekujem da ce uskoro biti "stabilan" posto ga vec dosta ljudi koristi, developeri prilicno brzo ispravljaju bagove a broj novih bagova je sve manji i manji ...
sve u svemu, koristis partitioning.
http://dev.mysql.com/doc/refman/5.1/en/partitioning.html
to ti omogucuje da tabelu "particionises" po nekom osnovu ... u tvom slucaju, particionises tabelu po datumu, tj jedan mesec jedna particija ... nemas nikakva smaranja sa rucnim mrdanjem podataka, renameom etc, svi podaci su u jednoj tabeli a opet - particionisani na nacin koji ti zelis:
Code:
CREATE TABLE employees (
id INT NOT NULL,
fname VARCHAR(30),
lname VARCHAR(30),
hired DATE NOT NULL DEFAULT '1970-01-01',
separated DATE NOT NULL DEFAULT '9999-12-31',
job_code INT,
store_id INT
)
PARTITION BY RANGE ( YEAR(separated) ) (
PARTITION p0 VALUES LESS THAN (1991),
PARTITION p1 VALUES LESS THAN (1996),
PARTITION p2 VALUES LESS THAN (2001),
PARTITION p3 VALUES LESS THAN MAXVALUE
);
Code:
CREATE TABLE employees (
id INT NOT NULL,
fname VARCHAR(30),
lname VARCHAR(30),
hired DATE NOT NULL DEFAULT '1970-01-01',
separated DATE NOT NULL DEFAULT '9999-12-31',
job_code INT,
store_id INT
)
PARTITION BY HASH( YEAR(hired) )
PARTITIONS 4;
nadam se da je jasno ...
naravno, sve ono sto sam rekao o brzini inserta vazi i dalje ...
- myisam tabela (posebno na toj bajatoj masini)
- ako mozes da stavis vise diskova razdvoji na razlicite diskove indexe i podatke (beskorisno je da stavljas na razlicite particije istog diska tako da to nemoj da radis)
- radi bulk insert
- pre inserta uradi "alter table t1 disable keys", posle inserta (cele grupe) uradi "alter table t1 enable keys;"
- ako je to sve cemu ce mysql da sluzi, startuj mysql bez podrske za innodb (kako isti ne koristis)
- podesi ostale parametre mysql-a prema kolicine memorije (sort buffer size i slicno)
to mu dodje to .. malo se igraj sa podesavanjima ... kako radis iz samo jednog thread-a jednostavne inserte .. trebalo bi da to myisam "pojede" .. ako ti nije potreban iskljuci binlog.... setuj dovoljno veliki broj file handles ako si na unix-u, ako si na windozi obrati paznju da imas hard limit koji ne mozes da zaobidjes na 2048 open files (to je tek u 6.0 zaobidjeno koristenjem winapi funkcija za rad sa fajlovima, windoze ima hard limit na 2048 open files za posix funkcije)... ako si na linux-u postavi swappiness na 0, ako si na windozi - to ti je sto ti je :) ne mozes mnogo toga da mu kazes ...
generalno bi trebalo da imas 10% bolje performanse sa linuxom na istom hardware-u, ali postoji mogucnost (imali skoro klijenta, izgubio sam pola cuke da nadjem problem :( ) da linux ima lose drajvere za tvoj hdd kontroler (tj losiji od windoze) tako da je u tom slucaju windoze "brzi"....
osnovni bottleneck ovde ti je IO .. dakle cpu tu nista ne radi .. koliko brzo moze disk da primi podatke, toliko ces brzo moci da insertujes nove podatke ... nema velike filozofije .. cela fora je povecatio IO troughput tako da
- ako moze hardware raid - stripe ce ubrzati io
- podeliti data i indexe na razlicite diskove - to ce ubrzati io
to ti je sto ti je ..
neki "los" benchmark kaze da moja masina (desktop) uradi 100K inserta (u int, int, int tabelu) za 0.07s ... to mu dodje 1.4M inserta u sekundi (neki 1T sata diskovi u software mirror-u dakle sporija varijanta) za single thread ...
ako ti se aplikacija i server nalaze na istoj masini, zaobidji tcp i teraj socket na linuxu ili named pipe na windozi izmedju klijenta i servera ... smanjices opterecenje sistema / io
to mu dodje to .. ako imas jos nekih pitanja vezano za detalje, samo pucaj
@Sapphire, znam za jadac :) .. inace, drago mi je da si to primetio, te da je jasno da je to privatni stav, ne zelim nikakvu prepisku o sta je bolje i to .. windoze, unix, dot ovaj, one onaj i to .. sve to ima svoje i sve se uglavnom svede na amiga vs pc