Jump to content
php.lv forumi

Par 1 000 000 teksta gabalu glabaashanu


Toms

Recommended Posts

  • Replies 62
  • Created
  • Last Reply

Top Posters In This Topic

Viss, uztaisiiju testu.

Nez, cik parezs, logjisks, nu bet klausies:

 

PC: AMD Athlon 2600 GHz, RAM 512 DUAL DDR 400 MHz, HDD WD SATA 160 GB.

Mosh videokarti pielikt? :D

 

Karoc uztaisiiju ieksh MySQL tabulu - MyISAM:

68 columns un 262196 rows.

 

table CREATE TABLE `table` (

`id` int(11) NOT NULL auto_increment,

`name1` varchar(64) NOT NULL default 'dgkgdtolsrhdgk',

`name2` varchar(64) NOT NULL default 'ghkghldtiuaeryh',

`name3` varchar(64) NOT NULL default 'gkgfuoldfrthrjfx',

`name4` varchar(64) NOT NULL default 'fujefdjfhkl',

`name5` varchar(64) NOT NULL default '',

`name6` varchar(64) NOT NULL default '',

`name7` varchar(128) NOT NULL default '',

`name8` varchar(128) NOT NULL default '',

... te veel ...

`name51` text NOT NULL,

`name52` text NOT NULL,

`name53` text NOT NULL,

`name54` text NOT NULL,

...

te veel

...

PRIMARY KEY (`id`)

) ENGINE=MyISAM DEFAULT CHARSET=latin1

 

 

Taa...

ieksh name, kas ir varchar sarakstiiju sho :

$name = 'archar(128) tin1_swedish_ci YES (NULL) select insert upd';

 

ieksh name, kas ir text, sho:

$text = 'ame58 text latin1_swedish_ci YES (NULL) select,insert,update,referenceame58 text latin1_swedish_ci YES (NULL) select,insert,update,reference';

 

 

Visaa datubaazee shie vienaadie ieraksti un kad sataisiiju tos 262196 ierakstus, tad taa uz HDD aiznjeema: 2,3 GB.

 

TAATAD: palaidu testu:

 $query = "SELECT id,name1,name2,name3,name4,name5,name6,name7,name8,name9,name10,name21,name23,name22,name24,name25,name26,name27,name28,name29,name20,name30,name31,name32,name33,name34,name35,name36,name37,name38,name39,name40,name41,name42,name43,name44,name45,name46,name47,name48,name49,name50,name51,name52,name53,name54,name55,name56,name57,name58,name59,name60,name61,name62,name63,name64,name65,name66,name67,name68,name69,name70,name71,name72,name73,name74,name75,name76,name79,name78 FROM $table WHERE id = '5745'";
for ($i = 1; $i < 1000; $i++)
 $result = mysql_query($query);

 

Kods izpildiijaas videeji: 1.0000388 sekundes. taatad tas sanaak, ka 1000 pieprasiijumus shaada veida datubaaze ir speejiiga izpildiit sekundes laikaa.

 

tad veel arii UPDATE pameegjinaaju - briizhiem 0.9995050 sekundes, briizhiem 0.0005285 sekundes... tas pats for cikls...

 

Tad kaads iisti tolks, ka ja man vienaa tabulaa buutu id,login un otraaa tabulaa id,user_id,...,...paareejies,pribambasi,...,.. kaadi 60 :)

Tak tad ir jaaapskata divas tabulas. Nosaciijums ir taads, ka es vienmeer njemu aaraa pilniigi visu info par lietotaaju un iebaazhu sessijas mainiigajaa vienaa.

 

Tagad davai bruuciet virsuu, ideju, kaa savaadaak lai patestee?

Mosh veel komentus par sho izvirtiibu... :)

Edited by Toms
Link to comment
Share on other sites

Tad veelviens jautaajums:

 

draugiem.lv - ieejot var redzeet - lapas apakshaa skripa izpildes laiks 1 sekunde, dazhreiz 3 sekundes. BET - kaapeec tik ilgi jagaida kameer ielaadeejas pie 10 000 lietotaaju online.

 

Kas nosaka to, ka tas notiek tik ilgi? Neta piesleguma aatrums?

Ja vinji izdaliitu visu uz 8 serveriem, un panjemtu 4 serveriem vienu neta piesleegumu un paareejiem chetriem citu (neatkariigu no pirmaa) neta piesleegumu, tad uzlabotots aatrums? (ar domu, ka ja pie vien pieleeguma jau ir klaat 4000 juuzeru, tad paareejos redirekteetu caur otru piesleegumu, taadaa veidaa panaakot aatruma uzlabojumu)

 

Vai varbuut vaina tajaa, ka lietotaaju pieprasiijumi gaida rindaa, kameer citi izpildaas? Bet ja saliek pa 8 vai vairaak serveriem, tad taksh buutu jaaizliidzinaas pieprasiijumu izpildes aatrumam..

 

Varbuut es kaut ko nesaprotu. KOMENTAARUS!!!

Link to comment
Share on other sites

draugiem.lv - ieejot var redzeet - lapas apakshaa skripa izpildes laiks 1 sekunde, dazhreiz 3 sekundes. BET - kaapeec tik ilgi jagaida kameer ielaadeejas pie 10 000 lietotaaju online.

Kas nosaka to, ka tas notiek tik ilgi? Neta piesleguma aatrums?

To pagaidaam nosaka web frontendu jauda, jebshu paraleeli izdaraamo pieprasiijumu skaitu. Proti ja webserveris (sheit ierobezhojums var paarnesties uz jebkuru citu arii db u.c.) speej panjemt 400-800 pieprasiijumus sekundee, tad ja teiksim ienaak konkurenti 801 pieprasiijumi tad peedeejam naakas nedaudz gaidiit. Un ar to ka web lapu serveeshanai php tiek darbinaats fastcgi modee kur tiek saspawnoti noteikts skaits paraleelu procesu.

 

Ja vinji izdaliitu visu uz 8 serveriem, un panjemtu 4 serveriem vienu neta piesleegumu un paareejiem chetriem citu (neatkariigu no pirmaa) neta piesleegumu, tad uzlabotots aatrums? (ar domu, ka ja pie vien pieleeguma jau ir klaat 4000 juuzeru, tad paareejos redirekteetu caur otru piesleegumu, taadaa veidaa panaakot aatruma uzlabojumu)

Nu tiikla piesleegumam ir nedaudz pastarpinaata noziime - lai arii pienjemot ka image serveris dienaa izgruuzh ap 500Gb trafika, tad teikt ka tas ir nebuutisks arii nevar.

Noslodze izliidzinaas ja lietojums ir skalaars. Proti nav iisti jeegas no 8 serveriem ja tie savaa starpaa nebalanceejas, nav jeegas no 8 serveriem ja aizmuguree ir viens db serveris kas taapat vairaak nespeej pavilkt.

 

Kods izpildiijaas videeji: 1.0000388 sekundes. taatad tas sanaak, ka 1000 pieprasiijumus shaada veida datubaaze ir speejiiga izpildiit sekundes laikaa.

Shis ir diezgan aplams secinaajums. Ja DB arii speej to izpildiit tad tas uzradiit tikai seciigaa kaartiiba pie kam WHERE id = '5745'"; MySQLs jau zimanto query cache kas noziimee ka resultsets jau ir atminjaa un principaa vairs selecteets netiek.

Pameegjini palaist vairaakus paraleelus skriptus ar dazhaadiem id kaa arii pa starpu ar UPDATE, INSERT un sajutiisi MyISAm table lockinga melnaas puses.

Link to comment
Share on other sites

Proti nav iisti jeegas no 8 serveriem ja tie savaa starpaa nebalanceejas, nav jeegas no 8 serveriem ja aizmuguree ir viens db serveris kas taapat vairaak nespeej pavilkt.
Kaapeec nelikt divus vai triis serverus datubaazei?
Shis ir diezgan aplams secinaajums

Tieshi to gribeeju dzirdeet.

 

Palaboju kodu:

for ($i = 1; $i < 100; $i++){
$rnd = rand(5 , 262196);
 $query = "UPDATE $table SET name1 = 'rsf',name2 = 'fdhjdjsodga',name3 = 'sdjkvhalsgadgd',name4 = 'sdjkvhalsgadgd',name5 = 'sdjkvhalsgadgd',name6 = 'sdjkvhalsgadgd',name7 = 'sdjkvhalsgadgd',name8 = 'sdjkvhalsgadgd',name9 = 'sdjkvhalsgadgd',name10 = 'adgaifbaksfksfklhsvfjlgsjalsvf',name21 = 'adgaifbaksfksfklhsvfjlgsjalsvf',name23 = 'adgaifbaksfksfklhsvfjlgsjalsvf',name22 = 'adgaifbaksfksfklhsvfjlgsjalsvf',name24 = 'adgaifbaksfksfklhsvfjlgsjalsvf',name25 = 'adgaifbaksfksfklhsvfjlgsjalsvf',name26 = 'adgaifbaksfksfklhsvfjlgsjalsvf',name27 = 'adgaifbaksfksfklhsvfjlgsjalsvf',name28 = 'adgaifbaksfksfklhsvfjlgsjalsvf',name29 = 'adgaifbaksfksfklhsvfjlgsjalsvf',name20 = 'adgaifbaksfksfklhsvfjlgsjalsvf',name30 = 'adgaifbaksfksfklhsvfjlgsjalsvf',name31 = 'adgaifbaksfksfklhsvfjlgsjalsvf',name32 = 'adgaifbaksfksfklhsvfjlgsjalsvf',name33 = 'adgaifbaksfksfklhsvfjlgsjalsvf',name34 = 'adgaifbaksfksfklhsvfjlgsjalsvf',name35 = 'adgaifbaksfksfklhsvfjlgsjalsvf',name36 = 'adgaifbaksfksfklhsvfjlgsjalsvf',name37 = 'adgaifbaksfksfklhsvfjlgsjalsvf',name38 = 'adgaifbaksfksfklhsvfjlgsjalsvf',name39 = 'adgaifbaksfksfklhsvfjlgsjalsvf',name40 = 'adgaifbaksfksfklhsvfjlgsjalsvf',name41 = 'adgaifbaksfksfklhsvfjlgsjalsvf',name42 = 'adgaifbaksfksfklhsvfjlgsjalsvf',name43 = 'adgaifbaksfksfklhsvfjlgsjalsvf',name44 = 'adgaifbaksfksfklhsvfjlgsjalsvf',name45 = 'adgaifbaksfksfklhsvfjlgsjalsvf',name46 = 'adgaifbaksfksfklhsvfjlgsjalsvf',name47 = 'adgaifbaksfksfklhsvfjlgsjalsvf',name48 = 'adgaifbaksfksfklhsvfjlgsjalsvf',name49 = 'adgaifbaksfksfklhsvfjlgsjalsvf',name50 = 'adgaifbaksfksfklhsvfjlgsjalsvf',name51 = 'adgaifbaksfksfklhsvfjlgsjalsvf',name52 = 'adgaifbaksfksfklhsvfjlgsjalsvf',name53 = 'adgaifbaksfksfklhsvfjlgsjalsvf',name54 = 'adgaifbaksfksfklhsvfjlgsjalsvf',name55 = 'adgaifbaksfksfklhsvfjlgsjalsvf',name56 = 'adgaifbaksfksfklhsvfjlgsjalsvf',name57 = 'adgaifbaksfksfklhsvfjlgsjalsvf',name58 = 'adgaifbaksfksfklhsvfjlgsjalsvf',name59 = 'adgaifbaksfksfklhsvfjlgsjalsvf',name60 = 'adgaifbaksfksfklhsvfjlgsjalsvf',name61 = 'adgaifbaksfksfklhsvfjlgsjalsvf',name62 = 'adgaifbaksfksfklhsvfjlgsjalsvf',name63 = 'adgaifbaksfksfklhsvfjlgsjalsvf',name64 = 'adgaifbaksfksfklhsvfjlgsjalsvf',name65 = 'adgaifbaksfksfklhsvfjlgsjalsvf',name66 = 'adgaifbaksfksfklhsvfjlgsjalsvf',name67 = 'adgaifbaksfksfklhsvfjlgsjalsvf',name68 = 'adgaifbaksfksfklhsvfjlgsjalsvf',name69 = 'adgaifbaksfksfklhsvfjlgsjalsvf',name70 = 'adgaifbaksfksfklhsvfjlgsjalsvf',name71 = 'adgaifbaksfksfklhsvfjlgsjalsvf',name72 = 'adgaifbaksfksfklhsvfjlgsjalsvf',name73 = 'adgaifbaksfksfklhsvfjlgsjalsvf',name74 = 'adgaifbaksfksfklhsvfjlgsjalsvf',name75 = 'adgaifbaksfksfklhsvfjlgsjalsvf',name76 = 'adgaifbaksfksfklhsvfjlgsjalsvf',name79 = 'adgaifbaksfksfklhsvfjlgsjalsvf',name78 = 'adgaifbaksfksfklhsvfjlgsjalsvf' WHERE id = '$rnd'";

 $result = mysql_query($query);
}

un tagad pagaaja videeji 5,5 sekundes. (uz 100 updeitiem)

 

Kaa buutu, ja buutu InnoDB? Buutu labaaki rezultaati?

 

Un neatbildeets paliek:

"Tad kaads iisti tolks, ka ja man vienaa tabulaa buutu id,login un otraaa tabulaa id,user_id,...,...paareejies,pribambasi,...,.. kaadi 60 smile.gif

Tak tad ir jaaapskata divas tabulas. Nosaciijums ir taads, ka es vienmeer njemu aaraa pilniigi visu info par lietotaaju un iebaazhu sessijas mainiigajaa vienaa."

Vienaa gadiijumaa jaaapstraadaa viena tabula - otraa divas...

Link to comment
Share on other sites

Kaapeec nelikt divus vai triis serverus datubaazei?
Izmaksas. Viens rackmountabls sterveris maksā 1-2+K Ls . Lēto kastīšu risinājumus pagaidām neatbalsta..

 

Kaa buutu, ja buutu InnoDB? Buutu labaaki rezultaati?
Innodb izmanto row level lockingu bet Selecti/Inserti ir lēnāki (tākā pie pēdējiem v;el tiek kurbulēti visādi commiti/rollbacki utt). Ja kveriji nav miksēti ar Update vai Insert labāk izmantot MyISAM tas būs ātrāk, ja tomēr ir tad jaskātās varbūt var iztikt ar LOW PRIORITY vai DELAYED, pretēji nekas cits neatliek kā lietot InnoDB

 

Un neatbildeets paliek:

"Tad kaads iisti tolks, ka ja man vienaa tabulaa buutu id,login un otraaa tabulaa id,user_id,...,...paareejies,pribambasi,...,.. kaadi 60 smile.gif

Tak tad ir jaaapskata divas tabulas. Nosaciijums ir taads, ka es vienmeer njemu aaraa pilniigi visu info par lietotaaju un iebaazhu sessijas mainiigajaa vienaa."

Vienaa gadiijumaa jaaapstraadaa viena tabula - otraa divas...

Teorētiski ātrāk varētu būt jo šādā gadijumā izejas (galvenā) tabula pēc kuras notiek autorizācija / vai kas cits ir mazāka un filesort gadijumā (ja mysqls netrāpa uz indexiem) strādās ātrāk taču pie normāli saindeksētas tabulas starpībai pēc teorijas nekādai nevajadzētu būt.

Link to comment
Share on other sites

Jaa InnoDB paspeeju jau notesteet - uz pusi leenaaki inserti vien.. ja neveel leenak.

 

Taatad: es mieriigi varu iztikt ar to pashu vienu tabulu. Noindekseejot biezhaak vajadziigaas kolonnas - id, login, name, surname, veel kaut kas. Kaadas 10 kopaa. Un viss pa kedu, ne?

 

Un ja es gribu uz diviem serveriem izdaliit to datubaazi, tad nekaa, ne? Vajadzeetu visu info daliit uz divaam dabulaam, ielikt katru savaa DB un katru darbinaat uz sava servera, ja?

 

Nu tjip - 2 - serveri - minimums divas tabulas. Vienu uz diviem nekaadiigi?

Link to comment
Share on other sites

Taatad: es mieriigi varu iztikt ar to pashu vienu tabulu. Noindekseejot biezhaak vajadziigaas kolonnas - id, login, name, surname, veel kaut kas. Kaadas 10 kopaa. Un viss pa kedu, ne?
Jā uz select nosacījumā ietvertajiem un sortējamajiem laukiem.

 

Un ja es gribu uz diviem serveriem izdaliit to datubaazi, tad nekaa, ne? Vajadzeetu visu info daliit uz divaam dabulaam, ielikt katru savaa DB un katru darbinaat uz sava servera, ja?

 

Nu tjip - 2 - serveri - minimums divas tabulas. Vienu uz diviem nekaadiigi?

Nu mysqlam ir iespējama replikācija starp vairākiem serveriem vai arī būvēt mysql clusteri:

http://dev.mysql.com/doc/mysql/en/replication-intro.html

http://dev.mysql.com/doc/mysql/en/mysql-cl...r-overview.html

 

Bet nu var jau teorētiski datus datīt tīri fiziski. Teiksim pēc tabulu noslogotības vienu tabulu uz viena servera otru uz otra (ja nav nepieciešamas relācijas utt). Vai arī ja arī savstarpēji (lietotāju) dati nav saistīti tad teiksim teiksim dalīt tā - pāra lietotāji (identifikators) uz viena nepāra uz otra (divi serveru gadijumā).

Link to comment
Share on other sites

Ja ir vairāki noindeksēti lauki, tad INSERT/UPDATE notiek lēnāk ne?

 

Ja sīki izdomāts, kura tabula veiks kādas darbības(INSERT/UPDATE) biežāk, tad attiecīgi arī var pielāgot vienai MyISAM un InnoDB tipu vai tad ne?

 

Ja runa iet par draugiem.lv servisu, tad Ls 1-2k vairs nav nekas liels...

Link to comment
Share on other sites

Ja ir vairāki noindeksēti lauki, tad INSERT/UPDATE notiek lēnāk ne?
Tā ir. Pēc laika vienībām: Inserting indexes: (1 x number of indexes)

http://dev.mysql.com/doc/mysql/en/insert-speed.html

 

Ja sīki izdomāts, kura tabula veiks kādas darbības(INSERT/UPDATE) biežāk, tad attiecīgi arī var pielāgot vienai MyISAM un InnoDB tipu vai tad ne?
Jā protams vienā db var būt dažādi tabulu tipi, taču tur atkal jāskatās jo tākā myisam un innodb kaut vai datu glabāšanas principi atšķiras tad ir zināma administratīva ķeska kā arī papildus resursi no servera - proti innodb enginei papildus jāizdala savi memory pooli utt

 

Ja runa iet par draugiem.lv servisu, tad Ls 1-2k vairs nav nekas liels...
Tas bija tikai tāds piemērs. Ja iepērk no supportēta kantora (šajā gadijumā IBM) tad summa palielinās + vēl uzturēšanas etc izmaksas. Pagaidām arī risinājums nav ne tuvu beigām..
Link to comment
Share on other sites

a kaa vislabaak izveidot taa, lai vareetu izmantot vairaakus bilzhu serverus?

tjip useris uploado failu, kaut kaa (nezinu kaa) jaanosaka kuraa serverii briiva vieta un tajaa jaaiekopee.

bet vispaar peec kaada principa parasti taa veido?

Link to comment
Share on other sites

a kaa vislabaak izveidot taa, lai vareetu izmantot vairaakus bilzhu serverus?

tjip useris uploado failu, kaut kaa (nezinu kaa) jaanosaka kuraa serverii briiva vieta un tajaa jaaiekopee.

bet vispaar peec kaada principa parasti taa veido?

17022[/snapback]

 

drīzāk nevis "kurā serverī ir brīva vieta", bet vienkārši vienmērīgi sadalīt bildes pa vairākiem serveriem.

 

Teorētiski risinājums nav diez ko sarežģīts. Ja visas kastes griežas uz Linux, tad galvenajam serverim caur NFS piemontējam atsevišķās direktorijās attiecīgo serveru failu sistēmas. Ja teiksim ir 3 serveri bildēm un bildes glabājam formā [auto-number-id].jpg, tad vienkārši katru trešo liekam savā direktorijā:

/home/pictures/1

/home/pictures/2

/home/pictures/3

Šajā momentā faili vairs reāli neglabāsies uz galvenā servera, bet uz attiecīgajiem bilžu serveriem.

 

Uz katra no bilžu serveriem tāpat griežas HTTP serveris.

 

Publiskajā pusē jau vienkārši atkarībā no tā paša ID bildei priekšā liekam jau attiecīgo http://www1.domain.com/images/ vai kaut kā tā.

Link to comment
Share on other sites

man ir neskaidrs shis adreses veidoshanas princips: http://www1.domain.com/images/

shur tur ir taads maniits, bet dns ieraksts tak ir uz domain.com bet kaa tas cipars tur mistiski veidojas?

 

un par to veidu ka liek katraa mapee savu bildi - skripts tak nezin vai ir briiva vieta.

khmm vai ar disk_free_space varees to noteikt?

Edited by smarty
Link to comment
Share on other sites


×
×
  • Create New...