24. november 2009 - 21:33
Der er
19 kommentarer og 1 løsning
Opdele een mysql database i flere
Hejsa Jeg har hørt at når man begynder at få et rigtig stort load på sin mysql database kan det betale sig at opdele denne til flere "clone" databaser, hvor man skriver til en anden end man læser. Jeg har dog lidt svært ved at forstå hvordan dette skal kunne fungere, er der nogen der kender til en guide, eller måske selv er eksperter på det område? Mange tak
Annonceindlæg fra Admin By Request
24. november 2009 - 21:38
#1
Det fungerer saadan: - man har N MySQL servere - 1 er master og N-1 er slaver - alle opdateringer sendes til master - opdateringer replikeres fra master til slaver - forespoergslerne fordeles ud paa de N-1 slaver
24. november 2009 - 21:40
#2
Du faar foerst brug for den slags, naar du har et ret stort setup. Jeg vil tro ca. naar du passerer 100000 USD pris skiltet for din database server.
24. november 2009 - 21:46
#3
Er det noget der vil kræve noget af selve koden? Eller sende scriptet stadig til samme server som så "distribuerer" ?
24. november 2009 - 21:54
#4
Der er flere muligheder:
1) Man kan styre det programmatisk fra kode.
2) Man kan connecte til IP addressen paa en load balancer som distribuerer ud til flere servere bag den.
3) Man kan bruge en smart driver.
Jeg tror ikke at PHP mysql og mysqli kan det. Men Java JDBC driveren kan lave finde ud af om der skal sendes til master eller loadbalances til flere slaves. Se
http://dev.mysql.com/doc/refman/5.1/en/connector-j-reference-replication-connection.html for eksempel.
24. november 2009 - 22:11
#5
Okay, på dèn måde. Mange tak. Så har jeg endnu et spørgsmål. Hvilken DB form er den hurtigste? Jeg har læst mig til at det ihvertfald ikke er MyIsam, som jeg kører. Men i så fald hvilken er den hurtigste, og hvad vil det egentlig kræve at ændre en MyIsam db til xx ? Igen mange tak
24. november 2009 - 22:45
#6
Okay, jeg er kommet frem til at man på en måde skal opdele sin kode sådan at man skriver et sted, og henter et andet. Spørgsmålet er hvorledes man gør det, hvis f.eks min kode ser således ud: $q = mysql_query("SELECT id FROM noget LIMIT 1")or die(mysql_error()); // Print id mysql_query("UPDATE noget SET `id`=`id`+1 WHERE id = '".$row['id']."'")or die(mysql_error()); Er der en ekstra variabel man så kaster ind i det ovenstående for at vælge hvilken db/server den så skal skrive til? Undskyld dumme spørgsmål :)
25. november 2009 - 00:07
#7
MyISAM anses normalt som den hurtigste storage engine fordi den ikke bruger log file. InnoDB bruger log fil. Det er noedvendigt for at understoette transaktioner men koster noget i performance.
25. november 2009 - 00:09
#8
Du skal eksplicit angive connection fremfor at bruge default. Altsaa: $selcon = mysql_connect(bla bla); $updcon = mysql_connect(bla bla); ... $q = mysql_query("SELECT id FROM noget LIMIT 1", $selcon)or die(mysql_error()); ... mysql_query("UPDATE noget SET `id`=`id`+1 WHERE id = '".$row['id']."'", $updcon)or die(mysql_error());
25. november 2009 - 00:10
#9
Meget vigtigt: skift til mysqli og prepared statement Lidt vigtigt: drop de ``
25. november 2009 - 00:23
#10
mysqli_query("..... Således? og hvilken forskel vil det gøre? ` er også en dårlig ide? Noget det ændrer på "performance"
25. november 2009 - 00:27
#11
25. november 2009 - 00:28
#12
Det beskytter mod SQL injection og vil i nogen tilfaelde give bedre performance.
25. november 2009 - 00:28
#13
`` er bare unoedvendigt hvis man vaelger nogle gode navne og en pine hvis man en dag skal skifte database tIl SQLServer eller en anden database.
25. november 2009 - 01:12
#14
Du nævnte ordet performance.. Det kan jeg godt lide. Jeg beskytter mine strenge med mysql_real_escape_string Men skal jeg konvertere til mysqli, så skal en streng som denne: $q = mysql_query(" $row = mysql_fetch_array( altså ændres til $q = mysql_prepare(" $row = mysqli_stmt_fetch( Jeg spørger blot for at være helt sikker :) Igen mange mange tak for hjælpen
25. november 2009 - 01:55
#15
Prepared statement er lidt bedre end real escape til at beskytte mod SQL injection. Nej - du skal lave kaldene lidt anderledes - check eksemplerne i det link jeg gav. Jeg kan evt. godt lige prøve og bixe et eksempel selv også.
25. november 2009 - 02:43
#16
Hvis du har tid og lyst til dig, ville jeg blive meget glad for at se præcis hvorledes :-) Hvis mysqli på nogen måde kan optimere min performance, så er det helt klart det der skal til..
25. november 2009 - 03:58
#17
Eksempel: old style: <?php $con = mysql_connect('localhost', 'root', '') or die(mysql_error()); mysql_select_db('Test', $con) or die(mysql_error()); $v = 'BB'; $query = mysql_query('SELECT f1 FROM t1 WHERE f2 = \'' . mysql_real_escape_string($v) . '\'', $con) or die(mysql_error()); while($row = mysql_fetch_array($query)) { print $row['f1'] . "\n"; } mysql_close($con); ?> new style: <?php $con = new mysqli('localhost', 'root', '', 'Test'); if(mysqli_connect_errno()) die(mysqli_connect_error()); if($stmt = $con->prepare('SELECT f1 FROM t1 WHERE f2 = ?')) { $stmt->bind_param('s', $v); $v = 'BB'; $stmt->execute(); $stmt->store_result(); $stmt->bind_result($f1); while ($stmt->fetch()) { print $f1 . "\n"; } $stmt->close(); } else { die($con->error); } $con->close(); ?>
03. december 2009 - 21:25
#19
Mange tak. Smider du et svar?
03. december 2009 - 22:20
#20
kommer her
Computerworld tilbyder specialiserede kurser i database-management